具有未導出字段的結構體克隆
在 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中文網其他相關文章!