go学习笔记struct

定义

值类型,赋值和传参会复制全部内容。可用”_”定义补位字段,支持指向自身类型的指针成员
package main

import "fmt"

type Node struct {
    _       int
    id      int
    data    *byte
    next    *Node
}

func main() {
    n1 := Node{
        id  : 1,
        data: nil,
    }

    n2 := Node{
        id  : 2,
        data: nil,
        next: &n1,
    }

    fmt.Println(n1, n2)
}
顺序初始化必须包含全部字段,否则会出错
package main

import "fmt"

type User struct {
    name    string
    age     int
}

func main() {
    u1 := User{"Tom", 20}
    //u2 := User{"Tom"}     //会报错,缺少字段
    fmt.Println(u1)
}
支持匿名结构,可用作结构成员或定义变量
package main

import "fmt"

type File struct {
    name    string
    size     int
    attr struct {
        perm    int
        owner   int
    }
}

func main() {
    f := File{
        name : "test.txt",
        size : 1024,
        //attr : {0755,1} //这样赋值会报错
    }

    f.attr.owner = 1
    f.attr.perm = 0755

    fmt.Println(f)

    d := File{
        name : "a.txt",
        size : 512,
    }

    var attr = struct {
        perm int
        owner int
    }{2, 0755}

    d.attr = attr

    fmt.Println(d)
}
注意m的赋值方式
package main

import "fmt"

type User struct {
    id     int
    name    string
}

func main() {
    m := map[User]int{
        User{1, "Tom"} : 100,
    }

    fmt.Println(m)      //100
}
匿名字段,其实是一种语法糖,就是一个与成员类型同名的字段,被匿名嵌入的可以使任何类型,当然也包括指针。可以像普通字段那样访问匿名字段成员,编译器从外向内逐级查找所有层次的匿名字段,知道发现目标或出错
package main

import "fmt"

type Resource struct {
    id int
}


type Manager struct {
    User
    title string
}

type User struct {
    Resource    //匿名字段,相当于引用上面的Resource结构
    name string
}

func main() {
    var m Manager
    m.id = 1
    m.name = "Jack"
    m.title = "Admin"

    fmt.Println(m)      //{{{1} Jack} Admin}
}
外层同名字段会遮蔽嵌入字段成员,相同层次的同名字段也会让编译器无所适从,解决方法是使用显示字段名
package main

import "fmt"

type Resource struct {
    id int
    name string
}


type Classify struct {
    id int
}

type User struct {
    Resource
    Classify
    name string
}

func main() {
    u := User{
        Resource{1, "pepple"},
        Classify{100},
        "Jack",
    }

    fmt.Println(u)
    fmt.Println(u.name)
    fmt.Println(u.Resource.id)
    fmt.Println(u.Classify.id)
}
坚持原创技术分享,您的支持将鼓励我继续创作!