考虑这个例子。假设我有一个在我的代码库中无处不在的对象:
type Person struct {
Name string
Age int
[some other fields]
}
在代码库的某个深处,我还有一些代码可以创建一个新的 Person
结构。也许它类似于下面的实用函数(请注意,这只是一些创建 Person
的函数的示例——我的问题的重点不是专门询问复制函数):
func copyPerson(origPerson Person) *Person {
copy := Person{
Name: origPerson.Name,
Age: origPerson.Age,
[some other fields]
}
return ©
}
另一位开发人员出现并向 Person
结构添加了一个新字段 Gender
。但是,由于 copyPerson
函数在一段遥远的代码中,他们忘记更新 copyPerson
。如果您在创建结构时省略参数,golang 不会抛出任何警告或错误,代码将编译并看起来工作正常;唯一的区别是 copyPerson
方法现在无法复制 Gender
结构,而 copyPerson
的结果将具有 Gender
替换为 nil 值(例如空字符串)。
防止这种情况发生的最佳方法是什么?有没有办法让 golang 在特定的结构初始化中强制执行不丢失参数?是否有可以检测此类潜在错误的 linter?
最佳答案
我要解决这个问题的方法是只使用 NewPerson(params)
而不是导出这个人。这使得获取 person
实例的唯一方法是通过您的 New
方法。
package person
// Struct is not exported
type person struct {
Name string
Age int
Gender bool
}
// We are forced to call the constructor to get an instance of person
func New(name string, age int, gender bool) person {
return person{name, age, gender}
}
这迫使每个人都从同一个地方获得一个实例。添加字段时,您可以将其添加到函数定义中,然后在构造新实例的任何地方都会出现编译时错误,因此您可以轻松找到它们并修复它们。
关于go - 防止在结构初始化中丢失字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54540633/