AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
### 匿名字段 一般情况下,定义结构体的时候是字段名与其他类型一一对应,实际上go支持只提供类型,而不写字段名的 方式,也就是匿名字段,也称为嵌入字段 .当匿名字段也是一个结构体的时候,那么这个结构体所拥有的全 部字段都被隐式的引入了当前定义的这个结构体 . #### 赋值 **注意 : 赋值的时候要么只写值,如果有一个字段写了字段名,那么所有的字段都要写字段名**. ~~~ type Person struct { name string gender byte age int } type Student struct { Person //只有类型,没有名字,继承了Person的成员 id int addr string } func main() { var s1 Student s1.Person.name = "jack" s1.Person.gender = '1' s1.Person.age = 20 s1.id = 1 s1.addr = "杭州" fmt.Println(s1) //自动推导类型 s2 := Student{Person{"米兰", '0', 22}, 2, "北京"} fmt.Printf("%+v\n", s2) //%+v 显示更详细 //指定成员初始化,没有初始化的为零值 s3 := Student{id: 4, addr: "上海"} fmt.Printf("%+v\n", s3) s4 := Student{Person: Person{name: "mike"}, id: 3} fmt.Printf("%+v", s4) } ~~~ ~~~ {{jack 49 20} 1 杭州} {Person:{name:米兰 gender:48 age:22} id:2 addr:北京} {Person:{name: gender:0 age:0} id:4 addr:上海} {Person:{name:mike gender:0 age:0} id:3 addr:} ~~~ #### 成员操作 ~~~ s1 := Student{Person{"jack", 1, 20}, 1, "杭州"} fmt.Printf("%+v\n", s1) s1.id = 2 s1.Person.name = "mike" fmt.Printf("%+v\n", s1) s1.Person = Person{"milan",0,18} fmt.Printf("%+v\n", s1) ~~~ #### 同名字段 就近原则,如果能在本作用域找到此成员,就操作此成员,如果找不到,就找继承的字段. ~~~ s1 := Student{Person{"jack",1,18},1,"milan","杭州"} fmt.Printf("%+v\n",s1) ~~~ ~~~ {Person:{name:jack gender:1 age:18} id:1 name:milan addr:杭州} ~~~ 改为如下: ~~~ type Person struct { name string gender byte age int } type Student struct { Person id int //name string //这里注释掉了 addr string } func main() { var s1 Student s1.name = "jack" fmt.Printf("%+v", s1) } ~~~ ~~~ {Person:{name:jack gender:0 age:0} id:0 addr:} //直接赋值到了继承的类型中的name上去了 ~~~ #### 非结构体匿名字段 ~~~ type myString string type Person struct { name string gender byte age int } type Student struct { Person int myString } func main() { s := Student{Person{"jack", 0, 18}, 666, "hello world"} fmt.Printf("%+v\n", s) fmt.Println(s.name, s.age, s.Person, s.int, s.myString) } ~~~ ~~~ {Person:{name:jack gender:0 age:18} int:666 myString:hello world} jack 18 {jack 0 18} 666 hello world ~~~ ### 结构体指针类型匿名字段 ~~~ type myString string type Person struct { name string gender byte age int } type Student struct { *Person int myString } func change(s Student) { s.Person.name = "米兰" s.int = 1000 } func main() { s := Student{&Person{"jack", 0, 18}, 666, "hello world"} fmt.Printf("%+v\n", s) fmt.Println(s.name, s.age, s.Person, s.int, s.myString) change(s) fmt.Println(s.Person, s.int) //两种方式 var s2 Student s2.Person = new(Person) //分配空间 s2.Person.name = "milan" fmt.Println(s2) } ~~~ ~~~ {Person:0xc42000a060 int:666 myString:hello world} jack 18 &{jack 0 18} 666 hello world &{米兰 0 18} 666 {0xc42000a0e0 0 } ~~~