go - 防止在结构初始化中丢失字段

标签 go struct initialization composite-literals

考虑这个例子。假设我有一个在我的代码库中无处不在的对象:

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 &copy
}

另一位开发人员出现并向 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/

相关文章:

go - 向nats组提出请求

validation - 在 go 中验证 http 请求的惯用方法

java - Java方法中的双重初始化意味着什么

oracle - Plsql 未初始化的集合

go - 删除所有标点符号(数字除外)

go - 如何扩展 go-yaml 以支持自定义标签

c++ - 正确地将 int 结构数组重新解释为 int 数组

c++ - 复制结构时出现 System.AccessViolationException

c - C 中的位域和 union 会出现问题

c++ - 使用 init-methods 来避免使用 new 分配对象——这是糟糕的设计吗?