首頁 >後端開發 >Golang >如何有效率地初始化Go中的嵌入式結構體?

如何有效率地初始化Go中的嵌入式結構體?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-17 01:03:24761瀏覽

How Can I Efficiently Initialize Embedded Structs in Go?

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 是嵌入欄位的事實,從而違反了封裝原則。如果將公共欄位移至嵌入式結構中,它還會帶來破壞初始化的風險。

要解決此問題,有兩種建議的解決方案:

  1. 嵌套複合文字:

    嵌套複合文字可用來初始化嵌入字段單一表達式:

    child := Child{Base: Base{ID: id}, a: a, b: b}
  2. Go 中的建議更改:

    Go 問題9859提出了一項更改,以使複合文字與欄位存取一致嵌入式類型。如果實現,此變更將允許使用以下語法:

    child := Child{ ID: id, a: a, b: b }

需要注意的是,嵌入類型並沒有提供真正意義上的封裝。儘管使用 child.ID 語法,應用程式仍然可以直接存取 child.Base.ID。

以上是如何有效率地初始化Go中的嵌入式結構體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn