小编Gas*_*onQ的帖子

如果结构浅拷贝,如何强制编译器错误?

我维护一个库,其中导出的结构具有不应浅拷贝的字段。例如:

type Example struct {
    Val    int
    Nums   []int
}
Run Code Online (Sandbox Code Playgroud)

作为Nums切片类型的字段,Foo实例的浅拷贝复制切片头并允许错误:

foo := Example{Val: 1, Nums: []int{100}}
bar := Example

bar.Nums[0] = 200

fmt.Println(foo.Nums) // [200]
Run Code Online (Sandbox Code Playgroud)

我想防止代码导入库以浅拷贝结构。可能的解决方案:

  • 返回一个指针的构造函数,但无论如何都不能阻止客户端取消引用和浅拷贝:
pfoo := lib.NewFoo() // returns type `*Foo`
foo := *pfoo // now variable foo is type `Foo`
foo2 := foo  // I don't want this
Run Code Online (Sandbox Code Playgroud)
  • 向库中添加丰富的文档以阻止浅拷贝。我也可以声明在我的库中的所有方法,其使用Foos到需要指针类型,使事情变得安全在我身边,但同样,进口商代码可能会改写函数使用Foo的值。
  • 添加一个Clone()方法到Foo,但这属于“文档”问题:人们可能不会阅读它。
  • 添加自定义检查,go vet但这不会导致编译器错误。
  • 重写库以避免暴露的不可复制字段
  • 忍受出现错误的可能性

但是,还有另一种方法可以强制编译器在结构浅拷贝上抛出错误吗?

struct go shallow-copy

1
推荐指数
1
解决办法
95
查看次数

标签 统计

go ×1

shallow-copy ×1

struct ×1