Go 中初始化組合結構的封裝注意事項
在Go 中,當處理包含嵌入結構的結構時,初始化可能會帶來挑戰,因為封裝問題。考慮以下範例:
type Base struct { ID string } type Child struct { Base a int b int }
當嘗試使用結構體文字初始化Child 結構時,我們遇到錯誤:
child := Child{ ID: id, a: a, b: b } // unknown field 'ID' in struct literal of type Child
這是因為ID 欄位繼承自嵌入的Base 結構體,無法透過Child 結構體直接存取。
為了在保持封裝性的同時解決這個問題,我們可以利用嵌套複合結構文字:
child := Child{Base: Base{ID: id}, a: a, b: b}
此方法涉及在Child 結構的複合文字中創建Base 結構的匿名實例,並明確初始化其ID 欄位。
另一個建議的解決方案是將 Go 語言修改為允許直接欄位存取嵌入類型。然而,值得注意的是,嵌入類型不提供完整的封裝,因為仍然可以直接訪問嵌入字段:
child.Base.ID // Example of direct access
總之,雖然嵌套複合文字為初始化嵌入結構提供了可行的解決方案以結構化的方式,了解Go 中嵌入式類型封裝的限制至關重要。
以上是如何在保持封裝性的同時正確初始化 Go 中的組合結構?的詳細內容。更多資訊請關注PHP中文網其他相關文章!