package main
import "fmt"
/*
结构struct
-Go中的struct与C中的struct非常相似,并且Go没有class
-使用type <Name> struct{}定义结构,名称遵循可见性规则
-支持指向自身的指针类型成员
-支持匿名结构,可用作成员定义成员变量
-匿名结构也可以用于map的值
-可以使用字面值对结构进行初始化
-允许直接通过指针来读写结构成员
-相同类型的成员可进行直接拷贝复制
-支持==与!=运算符,但不支持> 或 <
-支持你名字段,本质上是定义了以某个类型名为名称的字段
-嵌入结构作为你名字段看起来像继承,但不是继承
-可以使用你名字段指针
*/
type person struct {
Name string
Age int
}
type person_temp struct {
Name string
Age int
Contact struct {
Phone, City string
} //嵌套匿名结构
}
func main() {
a := person{}
a.Age = 13
a.Name = "joe"
b := person{
Name: "joe",
Age: 19,
} //字面值的初始化
A(&a)
fmt.Println("------")
fmt.Println(b)
fmt.Println("------")
c := person_temp{}
c.Age = 20
c.Name = "Lihuidi"
c.Contact.City = "邯郸"
c.Contact.Phone = "15684505257" //对嵌套匿名结构的结构的初始化方法
fmt.Println(c)
fmt.Println("------")
fmt.Println(a == b) //判断a和b是否相等
}
func A(per *person) {
fmt.Println("A", per)
}
//结构支持匿名结构
package main
import "fmt"
type human struct {
Sex int
}
type teacher struct {
human
Name string
Age int
}
type student struct {
human //本质上把结构名称作为字段名称
Name string
Age int
}
//结构的嵌入
func main() {
a := teacher{Name: "joe", Age: 19, human: human{Sex: 1}} //操作方法!
b := student{Name: "joe", Age: 20, human: human{Sex: 0}} //请记住这个操作方法!
a.Name = "joe2"
a.Age = 21
a.Sex = 0 //可见,嵌入之后所有的变量都属于新的结构了
fmt.Println(a, b)
}
package main
import (
"fmt"
)
type A struct {
B
Name string
}
type B struct {
Name string
}
func main() {
a := A{Name: "A", B: B{Name: "B"}}
fmt.Println(a.Name, a.B.Name) //成功取到了同名字段,如果最高级不存在Name,会自动往下找,知道找到Name
}
有疑问加站长微信联系(非本文作者)