Go语言学习笔记——struct

结构体是将零个或这多个任意类型额命令变量组合在一起的聚合数据类型

成员变量

成员通过.号方式来访问

结构体是一个变量,它的所有成员都是变量,因此可以给结构体的成员赋值。
或者获取成员变量的地址,然后通过指针来访问它

如果一个结构体变量名称是首字母大写的,那么这个变量是可导出的,这个是Go最主要的访问控制机制

命令结构体类型S不可以定义一个拥有相同结构体类型S的成员变量,也就是一个聚合类型不可以包含它自己,
但是S中可以定义一个S的指针类型,即***S,这样我们就可以创建一些递归数据结构,比如链表和树

零值

结构体的零值由结构体成员的零值组成,例如,在bytes.Buffer中,结构体的初始值就是一个可以直接使用的空缓存

空结构体

没有任何成员变量的结构体称为空结构体,struct{}

它没有长度,也不携带任何信息

初始化

结构体类型的值可以通过结构体字面量来设置,即通过设置结构体的成员变量来设置

type Point struct{ X, Y int }
p := Point{1, 2}

还有另一种初始化的格式,就是指定部分或者全部成员变量的名称和值类初始化结构体变量

p := Point{X: 1, Y: 2}

如果这种初始化方式中某个成员变量没有指定,那么它的值就是该成员变量类型的零值

这两种初始化方式不可以混合使用,另外也无法使用第一种初始化方式来绕过不可导出变量无法在其他包中使用的规则

package p
type T struct{ a, b int } // a和b都是不可导出的

package q
import "p"
var _ = p.T{a: 1, b: 2} // 编译错误,无法引用a、b
var _ = p.T{1, 2}       // 编译错误,无法引用a,b

由于通常结构体都通常通过指针的方式使用,因此可以使用一种简单的方式来创建、
初始化一个struct类型的变量并获取它的地址

pp := &Point{1, 2}

等价于

pp := new(Point)
*pp = Point{1, 2}

比较

如果结构体的所有成员都是可以比较的,那么这个结构体就是可以比较的,
==操作符按照顺序比较两个结构体变量的成员变量

结构体嵌套和匿名成员

type Point struct {
    X, Y int
}
type Circle struct {
    Center Point
    Radius int
}
type Wheel struct {
    Circle Circle
    Spokes int
}

这就是结构体嵌套,但是访问Wheel的成员会比较麻烦

var w Wheel
w.Circle.Center.X = 8
w.Circle.Center.Y = 8
w.Circle.Radius = 5
w.Spokes = 20

Go允许我们定义不带名称的结构体成员,只需要指定类型即可,这种结构体成员称为匿名成员。
这个结构体成员的类型必须是一个命令类型或者指向命令类型的指针

type Circle struct {
    Point
    Radius int
}
type Wheel struct {
    Circle
    Spokes int
}

访问Wheel的变量

var w Wheel
w.X = 8      // 等价于 w.Circle.Point.X = 8
w.Y = 8      // 等价于 w.Circle.Point.Y = 8
w.Radius = 5 // 等价于 w.Circle.Radius = 5
Spokes = 20

但是,结构体字面量并没有什么快捷方式来初始化结构体,所以下面的语句是无法通过编译的

w = Wheel{8, 8, 5, 20}                       // 编译错误,未知成员变量
w = Wheel{X: 8, Y: 8, Radius: 5, Spokes: 20} // 编译错误,未知成员变量

正确的做法是

w = Wheel{Circle{Point{8, 8}, 5}, 20}
w = Wheel{
    Circle: Circle{
        Point: Point{X: 8, Y: 8},
        Radius: 5,
    },
    Spokes: 20, // 注意,尾部的逗号是必须的
}

由于匿名成员拥有隐式的名字,所以在一个结构体里面定义两个相同类型的匿名成员,否则会引起冲突

由于匿名成员的名字是由它们的类型决定的,因此它们的可导出性也是由它们的类型决定的

总结

  • 成员通过.号方式来访问
  • 结构体的零值由结构体成员的零值组成
  • 如果结构体的所有成员都是可以比较的,那么这个结构体就是可以比较的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值