Go 中使用嵌入式結構體進行結構體初始化
組合結構體是Go 中用於程式碼組織和重用的常見做法。但是,當從嵌入結構繼承子欄位時,初始化組合結構可能會帶來挑戰。
考慮以下範例:
type Base struct { ID string } type Child struct { Base a int b int }
要初始化Child,人們可能會期望使用以下內容語法:
child := Child{ ID: id, a: a, b: b }
但是,由於Child 結構體文字中的欄位ID 未知,這將導致編譯錯誤。要解決此問題,必須單獨初始化 ID 欄位:
child := Child{ a: 23, b: 42 } child.ID = "foo"
這種方法暴露了 ID 是嵌入欄位的事實,從而違反了封裝原則。如果將公共欄位移至嵌入式結構中,它還會帶來破壞初始化的風險。
要解決此問題,有兩種建議的解決方案:
嵌套複合文字:
嵌套複合文字可用來初始化嵌入字段單一表達式:
child := Child{Base: Base{ID: id}, a: a, b: b}
Go 中的建議更改:
Go 問題9859提出了一項更改,以使複合文字與欄位存取一致嵌入式類型。如果實現,此變更將允許使用以下語法:
child := Child{ ID: id, a: a, b: b }
需要注意的是,嵌入類型並沒有提供真正意義上的封裝。儘管使用 child.ID 語法,應用程式仍然可以直接存取 child.Base.ID。
以上是如何有效率地初始化Go中的嵌入式結構體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!