AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
## 结构体 一个结构体就是一个聚合的数据类型,其实每一个成员都可以看做是独立的变量. 所以可以进行指针操作. ## 结构体零值 结构体类型的零值是每个成员都是零值。通常会将零值作为最合理的默认值。 ## 值类型和指针类型 ### 值类型 ~~~ type User struct { Name string Age int } func main() { u1 := User{ Name: "jack", Age: 10, } u2 := u1 u2.Name = "milan" fmt.Println(u1) fmt.Println(u2) } ~~~ ``` {jack 10} {milan 10} //值发生了改变 ``` ### 指针类型 ~~~ type User struct { Name string Age int } func main() { u1 := &User{ Name: "jack", Age: 10, } u2 := u1 u2.Name = "milan" fmt.Println(u1) fmt.Println(u2) } ~~~ ``` &{milan 10} &{milan 10} //两个值一起改变了 ``` ## 结构体值类型不能包含自己 一个命名为S的结构体类型将不能再包含S类型的成员:因为一个聚合的值不能包含它自身。(该限制同样适应于数组。)但是S类型的结构体可以包含`*S`指针类型的成员,这可以让我们创建递归的数据结构,比如链表和树结构等。 ## 字面值 结构体值也可以用结构体字面值表示,结构体字面值可以指定每个成员的值。 ~~~ type Point struct{ X, Y int } p := Point{1, 2} ~~~ 这里有两种形式的结构体字面值语法,上面的是第一种写法,要求以结构体成员定义的顺序为每个结构体成员指定一个字面值。它要求写代码和读代码的人要记住结构体的每个成员的类型和顺序,不过结构体成员有细微的调整就可能导致上述代码不能编译。因此,上述的语法一般只在定义结构体的包内部使用,或者是在较小的结构体中使用,这些结构体的成员排列比较规则,比如image.Point{x, y}或color.RGBA{red, green, blue, alpha}。 其实更常用的是第二种写法,以成员名字和相应的值来初始化,可以包含部分或全部的成员,如1.4节的Lissajous程序的写法: ~~~ anim := gif.GIF{LoopCount: nframes} ~~~ ## 结构体比较 如果结构体的全部成员都是可以比较的,那么结构体也是可以比较的(slice,map,func不可比较),那样的话两个结构体将可以使用==或!=运算符进行比较。相等比较运算符==将比较两个结构体的每个成员. ## 匿名成员 匿名成员可以省略中间匿名成员的名称直接去"."来进行访问. 但是如果匿名成员首字母是小写的(非导出),那么在该包内是可以访问的,但是在包外是不能访问的.