首頁 >後端開發 >Golang >如何複製具有未匯出欄位的 Go 結構?

如何複製具有未匯出欄位的 Go 結構?

Susan Sarandon
Susan Sarandon原創
2024-12-23 14:09:17763瀏覽

How Can I Clone Go Structs with Unexported Fields?

具有未導出字段的結構體克隆

在 Go 中,具有未導出字段的結構體對克隆對象提出了挑戰。考慮一個定義為的類型:

type T struct {
    S  string
    is []int
}

像下面這樣的簡單賦值不會創建一個獨立的副本:

p := T{"some string", []int{10, 20}}
q := p

這是因為該類型的未導出字段(is ) 不可存取且不能明確複製。

透過自訂克隆方法

一種解決方法是在擁有該類型的套件中提供 Clone 方法。但是,這僅適用於同一包中的類型。

第三方類型的限制

如果具有未導出字段的類型駐留在第三方包中,沒有直接的方法來克隆它。這是設計使然,因為未匯出的欄位應對聲明包保持私有。

替代方法

雖然無法克隆未導出的字段,但可以創建具有空(零)值的新結構字段:

var r somepackage.T
s := somepackage.T{S: p.S}

不安全做法

不建議為此目的使用不安全包,因為它可能會導致意外和潛在的不安全行為。

複製未匯出欄位

將一個結構分配給另一個相同類型時,未匯出的欄位將被正確複製。但是,修改這些欄位是不可能的(它們只能是 nil 或與原始指標值相同)。

type person struct {
    Name string
    age  *int
}

age := 22
p := &person{"Bob", &age}

p2 := new(person)
*p2 = *p // Copy unexported field

fmt.Println(p2) // Outputs: &{Bob 0x414020}

以上是如何複製具有未匯出欄位的 Go 結構?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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