2 回答

TA貢獻1797條經(jīng)驗 獲得超6個贊
Go支持一種稱為“結(jié)構(gòu)嵌入”或只是“嵌入”的獨特功能,這是一種一流的組合(與大多數(shù)OOP語言提供的一流繼承相比)。
嵌入允許您將一個結(jié)構(gòu)嵌入到另一個結(jié)構(gòu)中,以便可以引用嵌入結(jié)構(gòu)的成員,就好像它們是在父結(jié)構(gòu)上聲明的一樣:
type Player struct {
Age uint8 `json:"age"`
Name string `json:"name"`
UUID string `json:"uuid"`
}
type PlayerDynamo struct {
Player // PlayerDynamo "embeds" Player
Salary float32 `json:"salary"`
}
現(xiàn)在一個實例同時具有一個成員...PlayerDynamoPlayer
p := PlayerDynamo{}
p.Player.Name
和以下各項的嵌入字段:Player
p := PlayerDynamo{}
p.Name // Equivalent to p.Player.Name
甚至的方法也可以在 上調(diào)用 :PlayerPlayerDynamo
func (p Player) String() string {
return fmt.Sprintf("Player %q", p.Name)
}
p := PlayerDynamo{
Player: Player {
Name: "Bob",
},
}
fmt.Println(p.String()) // Player "Bob"
這與將 // 字段復(fù)制到 中并不完全相同:當(dāng)您聲明一個新的時,您仍然需要顯式初始化嵌入式:AgeNameUUIDPlayerDynamoPlayerDynamoPlayer
p := PlayerDynamo {
Player: Player {
Name: "test",
Age: 45,
}
Salary: 42
}
至關(guān)重要的是,結(jié)構(gòu)標記被復(fù)制過來,編組到 JSON 的工作按預(yù)期工作,所有字段都顯示在 .PlayerPlayerDynamo
有關(guān)實際示例,請參閱 https://play.golang.org/p/6HMrlVZzIsn。

TA貢獻1785條經(jīng)驗 獲得超4個贊
使用嵌入:
type PlayerDynamo struct {
Player
Salary float32 `json:"salary"`
}
- 2 回答
- 0 關(guān)注
- 97 瀏覽
添加回答
舉報