我维护一个库,其中导出的结构具有不应浅拷贝的字段。例如:
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但这不会导致编译器错误。但是,还有另一种方法可以强制编译器在结构浅拷贝上抛出错误吗?