结构体:结构体是用户定义的类型,由若干字段组成的集合。是一个数据的封装。
1 package main 2 3 import "fmt" 4 5 type person struct { 6 name string 7 age int 8 } 9 10 func main() { 11 fmt.Println(person{"Bob", 20}) 12 fmt.Println(person{name: "Alice", age: 30}) 13 fmt.Println(person{name: "Fred"}) // 省略的字段将初始化为零值 14 fmt.Println(&person{name: "Ann", age: 40}) 15 s := person{name: "Sean", age: 50} 16 fmt.Println(s.name) // 使用点号来访问结构体 17 sp := &s 18 fmt.Println(sp.age) // 使用点号访问结构体指针的成员:指针会自动解引用 19 20 sp.age = 51 21 fmt.Println(sp.age) 22 fmt.Println(s.age) 23 }
当我们创建结构体时,字段可以只有类型,没有字段名。这称为匿名字段。
1 package main 2 3 import "fmt" 4 5 /* 创建的person结构体中有两个匿名字段string和int */ 6 type person struct { 7 string 8 int 9 } 10 11 func main() { 12 p := person{"Naveen", 50} 13 fmt.Println(p) 14 15 /* 虽然匿名字段没有名称,但其实匿名字段的名称就默认为它的类型. 16 * 比如person结构体中,虽然字段是匿名的,但是Go默认这些字段名 17 * 是它们各自的类型.所以person结构体中有两个名为string和int的字段 18 */ 19 var p1 person 20 p1.string = "Bob" 21 p1.int = 50 22 fmt.Println(p1) 23 }
结构体的字段也有可能是一个结构体,这称为嵌套结构体。
1 package main 2 3 import "fmt" 4 5 type address struct { 6 city, state string 7 } 8 9 type person struct { 10 name string 11 age int 12 addr address 13 } 14 15 func main() { 16 var p person 17 p.name = "Naveen" 18 p.age = 50 19 p.addr = address{city: "Chicago", state: "Illinois"} 20 fmt.Println("Name:", p.name) 21 fmt.Println("Age:", p.age) 22 fmt.Println("City:", p.addr.city) 23 fmt.Println("State:", p.addr.state) 24 }
如果结构体中有匿名的结构体字段,则该匿名的结构体字段就称为提升字段。
1 package main 2 3 import "fmt" 4 5 type address struct { 6 city, state string 7 age int 8 } 9 10 type person struct { 11 name string 12 age int 13 address // 这是一个提升字段 14 } 15 16 func main() { 17 var p person 18 p.name = "Naveen" 19 p.age = 50 20 p.address = address{city: "Chicago", state: "Illinois", age: 40} 21 fmt.Println("Name:", p.name) 22 fmt.Println("State:", p.address.state) // 由于匿名字段Go中默认字段名是类型,所以默认有address字段 23 fmt.Println("City:", p.city) // 提升字段,直接访问匿名结构体中的字段 24 25 /* person和address都包含age字段,这时会先从外部结构体找起, 26 * 一层一层的找,直到找到这个字段,所以会先在person结构体中找 27 * 发现有一个age字段,于是返回. 28 */ 29 fmt.Println("Age:", p.age) // 结果为50 30 }
1、https://studygolang.com/articles/12263
2、https://books.studygolang.com/gobyexample/structs/
原文:https://www.cnblogs.com/LydiammZuo/p/11924841.html