Go 中的struct與C中的struct非常相似,并且Go沒有class
使用 type <Name> struct{} 定義結(jié)構(gòu),名稱遵循可見性規(guī)則
type person struct{
Name string
Age int
}
func main(){
a := person{}
a.Name = "joe"
a.Age = 19
fmt.Println(a)
b := pserson{
Name : "jole",
Age : 12,
}
fmt.Println(b)
}
支持指向自身的指針類型成員
支持匿名結(jié)構(gòu),可用作成員或定義成員變量
匿名結(jié)構(gòu)也可以用于map的值
可以使用字面值對結(jié)構(gòu)進(jìn)行初始化
允許直接通過指針來讀寫結(jié)構(gòu)成員
相同類型的成員可進(jìn)行直接拷貝賦值
支持 == 與 !=比較運(yùn)算符,但不支持 > 或 <
支持匿名字段,本質(zhì)上是定義了以某個類型名為名稱的字段
嵌入結(jié)構(gòu)作為匿名字段看起來像繼承,但不是繼承
可以使用匿名字段指針
func main(){
a := pserson{
Name : "jole",
Age : 12,
}
fmt.Println(a)
A(a) //這里傳入不是地址 里面輸出的age變13
fmt.Println(a) //這里輸出的age還是12
A(&a) //這里傳入是地址 里面輸出的age變13
fmt.Println(a) //這里輸出的age也是13
//為了更加方便那就可以
b := &pserson{
Name : "jole",
Age : 12,
}
fmt.Println(b)
A(b) //這里就可以直接傳入地址
fmt.Println(b)
//匿名結(jié)構(gòu)
c := &struct {
Name string
Age int
}{
Name : "joe"
Age : 19
}
}
func A(per *person){
per.Age =13
fmt.Println("A",per)
}
func B(per *preson){
}
---end
//嵌套匿名結(jié)構(gòu)
type person struct {
Name string
Age int
Contact struct {
Phone string
City string
CN,Sex string//多個定義類型
}
}
func main(){
a := person{Name: "joe", Age: 19}
a.Contact.Phone = "12456" //只能通過這樣的方式進(jìn)行結(jié)構(gòu)體中的結(jié)構(gòu)體
a.Contact.City= "wenzhou"
fmt.Println(a)
}
--end
type person struct{//這樣屬于匿名結(jié)構(gòu)
string
int
}
func main(){
a := person{ "joe", 18}
fmt.Println(a)
}
---end
//嵌入結(jié)構(gòu) 類似預(yù)面向?qū)ο蟮睦^承
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: "jjj", Age: 19, human: human{Sex: 0}}
b := teacher{Name: "jjj", Age: 20, human: human{Sex: 1}}
a.Age = "j23"
a.human.Sex = 100
a.Sex = 200 //嵌入式的特色
}