兄弟連go教程(19)資料 - 匿名欄位

尹成發表於2018-07-04

匿名欄位不過是⼀一種語法糖,從根本上說,就是⼀一個與成員型別同名 (不含包名) 的欄位。
被匿名嵌⼊入的可以是任何型別,當然也包括指標。
type User struct {
name string
}
type Manager struct {
User
title string
}

m := Manager{
User: User{"Tom"}, // 匿名欄位的顯式欄位名,和型別名相同。
title: "Administrator",
}


可以像普通欄位那樣訪問匿名欄位成員,編譯器從外向內逐級查詢所有層次的匿名欄位,
直到發現⺫⽬目標或出錯。
type Resource struct {
id int
}
type User struct {
Resource
name string
}
type Manager struct {
User
title string
}
var m Manager
m.id = 1
m.name = "Jack"
m.title = "Administrator"


外層同名欄位會遮蔽嵌⼊入欄位成員,相同層次的同名欄位也會讓編譯器⽆無所適從。解決⽅方
法是使⽤用顯式欄位名。
type Resource struct {
id int
name string
}
type Classify struct {
id int
}
type User struct {
Resource // Resource.id 與 Classify.id 處於同⼀一層次。
Classify
name string // 遮蔽 Resource.name。
}
u := User{

Resource{1, "people"},
Classify{100},
"Jack",
}
println(u.name) // User.name: Jack
println(u.Resource.name) // people
// println(u.id) // Error: ambiguous selector u.id
println(u.Classify.id) // 100


不能同時嵌⼊入某⼀一型別和其指標型別,因為它們名字相同。
type Resource struct {
id int
}
type User struct {
*Resource
// Resource // Error: duplicate field Resource
name string
}
u := User{
&Resource{1},
"Administrator",
}
println(u.id)
println(u.Resource.id)

尹成老師

QQ77025077 

微信18510341407

所有視訊在尹成學院

www.yinchengxueyuan.com

尹成百度雲請聯絡QQ475318423


相關文章