Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。
结构体表示一项记录,比如保存图书馆的书籍记录,每本书有以下属性:
itle :标题
Author : 作者
Subject:
学科 ID:书籍ID
- 使用 type < Name > struct{ } 定义结构,名称遵循可见性规则
type person struct {
Name string
Age int
}
func main() {
//可以使用字面值对结构进行初始化
a := person{
Name: "yang",
Age: 20,
}
//如果要访问结构体成员,需要使用点号 . 操作符,
a.Age = 19
fmt.Println(a) //{yang 19}
}
- 结构是值类型,所以对结构进行传递的时候是值拷贝,不会影响本来的值
func main() {
a := person{
Name: "yang",
Age: 20,
}
fmt.Println(a) //{yang 20}
A(a)
fmt.Println(a) //{yang 20}
}
func A(per person) {
per.Age = 18
fmt.Println("A", per) //A {yang 18}
}
- 允许直接通过指针来读写结构成员,如果通过指针进行传递的话,本来的值就会被改变了
func main() {
a := &person{ //此时a是指向结构的指针
Name: "yang",
Age: 20,
}
a.Name = "yuanmie" //此时可以直接更改属性,不需要用(*a.Name = "yuanmie")这样用*取出指针指向的底层值
fmt.Println(a) //&{yuanmie 20}
A(a)
fmt.Println(a) //&{yuanmie 18}
}
func A(per *person) {
per.Age = 18
fmt.Println("A", per) //A &{yuanmie 18}
}
- 支持匿名结构,可用作成员或定义成员变量
func main() {
a := struct { //取地址的话直接&struct就可以
Name string
Age int
}{
Name: "xu",
Age: 18,
}
fmt.Println(a) //{xu 18}
}
- 匿名结构也可以嵌套在其他结构中
type person struct {
Name string
Age int
Contact struct { //注意Contact不是结构名,而是person结构的第三个属性名
phone, city string
}
}
func main() {
a := person{Name: "xy", Age: 18}
a.Contact.phone = "12345678910"
a.Contact.city = "beijing"
fmt.Println(a) //{xy 18 {12345678910 beijing}}
}
- 相同类型的成员可进行直接拷贝赋值,支持 == 与 !=比较运算符,但不支持 > 或 <
type person struct {
Name string
Age int
}
func main() {
a := person{Name: "xy", Age: 18}
var b person
b = a
fmt.Println(b) //{xy 18}
fmt.Println(b == a) //true
}
- 支持匿名字段,本质上是定义了以某个类型名为名称的字段
type person struct {
string
int
}
func main() {
a := person{"xy", 18} //赋值的类型必须严格按照结构里的类型顺序
fmt.Println(a) //{xy 18}
}
- 嵌入结构作为匿名字段看起来像继承,但不是继承
type human struct {
Sex int
}
type person struct {
human
Name string
Age int
}
type student struct {
human
Name string
Age int
}
func main() {
a := person{Name: "xy", Age: 18, human: human{Sex: 0}}
b := student{Name: "ym", Age: 20, human: human{Sex: 1}}
fmt.Println(a, b) //{{0} xy 18} {{1} ym 20}
a.Name = "xy2"
a.Age = 13
a.Sex = 1
fmt.Println(a, b) //{{1} xy2 13} {{1} ym 20}
}
- 嵌入结构和外层结构有同名字段时候:
type A struct {
B
Name string
}
type B struct {
Name string
}
func main() {
a := A{Name: "xy", B: B{Name: "ym"}}
fmt.Println(a) //{{ym} xy}
fmt.Println(a.Name) //xy
fmt.Println(a.B.Name) //ym
}