【发布时间】:2019-02-05 18:15:19
【问题描述】:
考虑这个例子。假设我有这个在我的代码库中无处不在的对象:
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?
【问题讨论】:
-
最好的方法是编写自定义 linter。
-
在单元测试期间很容易发现的假设问题,因此无需担心。
-
@Volker 你的评论让我想起了 Beeblebrox 的 Peril Sensitive Sunglasses。 ???不过不是想让你难过。
标签: go struct initialization composite-literals