3 回答

TA貢獻(xiàn)1719條經(jīng)驗(yàn) 獲得超6個(gè)贊
值得仔細(xì)閱讀有關(guān)嵌入Effective Go的部分。
一個(gè)常見的例子是有一個(gè)帶有互斥體的結(jié)構(gòu)/映射。
type SafeStruct struct {
SomeField string
*sync.Mutex
}
打字要容易得多
safe := SafeStruct{SomeField: "init value"}
safe.Lock()
defer safe.Unlock()
safe.SomeField = "new value"
而不是必須編寫適當(dāng)?shù)陌b函數(shù)(這是重復(fù)的)或有口吃
safe.mutex.Unlock()
當(dāng)你將永遠(yuǎn)做互斥領(lǐng)域的唯一事情就是訪問方法(Lock()和Unlock()在這種情況下)
當(dāng)您嘗試在嵌入式字段上使用多個(gè)函數(shù)(實(shí)現(xiàn)類似 的接口io.ReadWriter)時(shí),這會(huì)變得更加有用。

TA貢獻(xiàn)1845條經(jīng)驗(yàn) 獲得超8個(gè)贊
我將嘗試回答原始問題 - 有時(shí)人們使用“組合”而不是嵌入來隱藏嵌入結(jié)構(gòu)的功能。不是一個(gè)很好的用例 - 但人們有時(shí)更喜歡它。
type Obj1composed struct {
notExportedObj1 obj1
}
func NewObj1Composed(someParam Params) Obj1composed {
...
}
func (o Obj1Composed) Print() {
// Some heavy calculations here. Make Dozens of API calls
// print some data
}

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超4個(gè)贊
在您的示例中,我還想針對(duì)第一種情況介紹一點(diǎn)。如果obj1Inherited
和obj2
具有相同名稱的方法,則該方法調(diào)用(來自obj1Inherited
實(shí)例)將始終執(zhí)行obj1Inherited
方法。
要調(diào)用obj2
方法,您可以使用不推廣的其他方法
- 3 回答
- 0 關(guān)注
- 147 瀏覽
添加回答
舉報(bào)