结构体是一种聚合的数据类型,它是由一系列具有相同类型或不同类型的数据结构组成的数据集合。每个数据成为结构体的成员。
结构体的创建
type Student struct{}
var s1 Student = Student{}
var p1 *Student = &Student{}
p2 := &Student{name:"zhangsan",addr:"bj"}
结构体的操作
s.id = 1
p1 := &s
p1.id = "mike" (==) (*p1).id = "mike"
如果结构体的全部成员都是可以比较的,那么结构体也是可以比较的,那样的话两个结构体将可以使用"=="和"!="运算符。
结构体传递是值传递,结构体指针传递是引入传递
结构体和匿名字段
只提供类型,不写字段名就是匿名字段,也称为嵌入字段。结构体通过匿名字段实现继承。
var s1 Student = Student{Person{"mike","m"},1}
s1.Person.name = "jack"
同名字段,就近原则,由外到内
方法
带有接收者的函数称为方法,一个方法是一个和特殊类型关联的函数
func (receiver ReceiverType) funName(parameters) (results)
接口
接口是一个自定义类型,接口类型具体描述了一系列方法的集合。
结构体实现了接口的方式,是添加一个实现接口函数的指针方法
接口超集可以转换为子集,子集不能转换为超集
空接口
空接口(interface{})不包含任何的方法,正因为如此,所有的类型都实现了空接口,因此空接口可以存储任意类型的数值。