首页 >后端开发 >Golang >如何克隆具有未导出字段的 Go 结构?

如何克隆具有未导出字段的 Go 结构?

Susan Sarandon
Susan Sarandon原创
2024-12-23 14:09:17762浏览

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