具有未导出字段的结构体克隆
在 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中文网其他相关文章!