目录
摘要
定义结构,使用结构,值传递与指针传递,匿名结构,结构的组合
结构
概念
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
则为不同变量。
即,外部结构不具备内部结构的某一成员时,外部结构直接使用该成员实际使用的是内部结构的成员。
当外部结构和内部结构有同名的成员时,外部结构使用的外部结构的成员,内部结构使用的是内部结构的成员。
有疑问加站长微信联系(非本文作者)