【Golang基础总结】结构体

结构体:结构体是用户定义的类型,由若干字段组成的集合。是一个数据的封装。

一、结构体的初始化

 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