我有一個與此類似的問題:從嵌入式 struct 訪問 struct 字段,但不是嵌入式結(jié)構(gòu),而是只有一個嵌套結(jié)構(gòu)?;旧?,我需要的是從嵌套結(jié)構(gòu)訪問外部結(jié)構(gòu)的可能性。但是,在接受的答案中建議的組合方法不適合我當(dāng)前的“結(jié)構(gòu)結(jié)構(gòu)”,因此如果沒有一些繁瑣的重構(gòu),它實際上并不適用。相反,我想出了將指向外部結(jié)構(gòu)的指針嵌入到內(nèi)部結(jié)構(gòu)中的想法:type Outer struct { someField int innerStruct Inner}type Inner struct { outerStruct *Outer}func test() { outer := Outer{someField:123} inner := Inner{outerStruct:&outer} outer.innerStruct = inner println(inner.outerStruct.someField) // just to test}所以,現(xiàn)在我想知道,從意識形態(tài)上講,這是否是 Go 的有效方法?這種方法有什么可能的缺點嗎?
2 回答

慕碼人2483693
TA貢獻(xiàn)1860條經(jīng)驗 獲得超9個贊
擁有指向外部結(jié)構(gòu)的指針是唯一的方法。缺點是您必須確保指針已初始化。所以,像構(gòu)造函數(shù)這樣的東西可能會有所幫助:
func NewOuter() *Outer {
ret:=Outer{}
ret.outer=&ret
return &ret
}
此外,您必須注意如何傳遞Outer,因為內(nèi)部結(jié)構(gòu)中的指針可能最終指向您不期望的 Outer 實例:
func f(o Outer) {
g(&o)
}
上面,g將獲得一個實例,Outer其指針指向與Outer它所獲得的實例不同的實例。

尚方寶劍之說
TA貢獻(xiàn)1788條經(jīng)驗 獲得超4個贊
如果你真的想這樣做,你需要確保你永遠(yuǎn)不要復(fù)制 Outer,因為副本的 Inner 將指向錯誤的 Outer。
請參閱 sync.Mutex 或 WaitGroup 以了解如何制作無法復(fù)制的結(jié)構(gòu)。
- 2 回答
- 0 關(guān)注
- 83 瀏覽
添加回答
舉報
0/150
提交
取消