结构
概念
- Go 中没有 class 的概念,结构可以完成类似功能
- 支持指向自身的指针类型成员
- 支持匿名结构
- 支持==和!=运算符
创建结构
格式
type <Name> struct{}
type person struct {
name string
age int
}
使用结构
结构变量的各个字段都会有默认值
p1 := person{name: "Jack"}
p1.name = "Peter" //p1 {Peter 0}
值传递
参数中的结构默认为值传递
p2 := person{name: "Jack", age: 20}
changeAge(p2)
func changeAge(p person) {
p.age = 99
fmt.Println(p) //{Jack 99}
}
fmt.Println("p2", p2) //p2 {Jack 20}
可以通过使用指针改变原来的值
p2 := person{name: "Jack", age: 20}
changeAge(p2)
func changeAge2(p *person) {
p.age = 99
fmt.Println(p) //&{Jack 99}
}
fmt.Println("p2", p2) //p2 {Jack 99}
也可以在定义时直接使用指针
p3 := &person{name: "Andy"}
匿名结构
创建匿名结构
p4 := struct {
name string
age int
}
也可以在定义时直接进行初始化,但是初始化的最后不能少掉逗号
p4 := struct {
name string
age int
}{
name: "Joe",
age: 20, //不能少逗号
}
结构中也可以包括匿名结构
type person struct {
name string
age int
//匿名结构
address struct {
street string
}
}
结构的组合
概念
由于 Go 没有类和继承的概念,所以要实现类似功能,需要使用组合,即一个结构中包含另一个结构的变量
定义一个组合
type person struct {
name string
age int
}
type student struct {
name string
no int
person
}
以上在 student 结构中组合了一个 person结构,默认 student 会产生一个与此结构相同的成员
且组合的成员会直接添加到外部结构中
使用组合
stu := student{name: "Andy", no: 20, person: person{name: "Tony", age: 20}}
stu.person.age = 21
stu.age = 22
fmt.Println(stu) //{Andy 20 {Tony 22 }}
stu.name = "A"
stu.person.name = "B"
fmt.Println(stu) //{A 20 {B 22 {}}}
以上 stu.person.age 和 stu.age 实际操作的是同一变量,而 stu.person.name 和 stu.name 则为不同变量