如何克隆具有未导出字段的结构?
在 Go 中,具有未导出字段的结构在克隆对象时会带来挑战。如果结构体的字段未导出,则无法在声明包之外访问或修改它。
问题:
考虑以下 T 结构:
type T struct { S string is []int }
将一个 T 对象分配给另一个 T 对象不会创建独立副本,因为未导出的字段是
解决方案1:Clone方法
最直接的解决方案是在定义T的包中提供Clone方法。该方法可以显式复制 T 的字段,包括未导出的字段 is。
解决方案 2:Setters
如果提供 Clone 方法不可行,则提供 setter未导出字段的函数,例如 SetIs(),允许对
限制:
需要注意的是,这些解决方案依赖于该类型源代码的可用性。如果使用第三方软件包,如果不修改原始软件包,则可能无法克隆具有未导出字段的结构。
不安全方法(不推荐):
虽然使用 unsafe 包可以绕过对未导出字段的访问限制,强烈建议不要使用这种方法,因为它违反了 Go 的封装原则,并可能导致运行时错误。
替代选项:
如果修改未导出的字段不是必需的,请考虑将所需数据提取到单独的克隆结构中。例如,可以使用反射提取未导出的 is 字段,保留其初始值。
var r T s := T{S: p.S}
结论:
使用未导出字段克隆结构需要仔细考虑和可能涉及特定于包的解决方案。在评估可用选项时,优先考虑代码安全和封装至关重要。
以上是如何克隆具有未导出字段的 Go 结构体?的详细内容。更多信息请关注PHP中文网其他相关文章!