具有未导出字段的 Golang 结构文字语法
Golang struct literal syntax with unexported fields
我有一个较大的结构,直到现在我还在用结构文字语法实例化它,例如:
Thing{
"the name",
...
}
我刚刚在 Thing
结构中添加了一个未导出的字段,现在 Go 正在抱怨:implicit assignment of unexported field 'config' in Thing literal
.
有什么方法可以继续使用文字语法,即使现在结构上有一个未导出的字段?
如果您在文字中使用 keyed values,则只能使用 composite literals 来创建在另一个包中定义的结构类型的值,因为这样您就不需要为所有字段提供初始值,因此您可以省略未导出的字段(只有声明包可以设置/更改)。
如果类型声明在同一个包中,您也可以设置未导出的字段:
t := Thing{
Name: "the name",
someUnexported: 23,
}
但如果类型在另一个包中声明,则只能为导出字段提供初始值,我想这并不奇怪:
t := otherpackage.Thing{
Name: "the name",
// someUnexported will implicitly be its zero value
}
如果您需要结构的值,其中未导出的字段的值不是其类型的零值,则包本身必须导出某种构造函数或初始化程序(或 setter 方法),因为来自在(包的)外部,您不能更改/设置未导出的字段。
参见相关问题:
再补充一点。结构的所有属性都应以大写字母 开头,如果它们应该在包外可见 。例如:
t := Thing
{
Name: "the name", // <-- This will work because Name start with capital letter
someUnexported: 23, // <-- this wont work because someUnexported starts with small letter
}
我有一个较大的结构,直到现在我还在用结构文字语法实例化它,例如:
Thing{
"the name",
...
}
我刚刚在 Thing
结构中添加了一个未导出的字段,现在 Go 正在抱怨:implicit assignment of unexported field 'config' in Thing literal
.
有什么方法可以继续使用文字语法,即使现在结构上有一个未导出的字段?
如果您在文字中使用 keyed values,则只能使用 composite literals 来创建在另一个包中定义的结构类型的值,因为这样您就不需要为所有字段提供初始值,因此您可以省略未导出的字段(只有声明包可以设置/更改)。
如果类型声明在同一个包中,您也可以设置未导出的字段:
t := Thing{
Name: "the name",
someUnexported: 23,
}
但如果类型在另一个包中声明,则只能为导出字段提供初始值,我想这并不奇怪:
t := otherpackage.Thing{
Name: "the name",
// someUnexported will implicitly be its zero value
}
如果您需要结构的值,其中未导出的字段的值不是其类型的零值,则包本身必须导出某种构造函数或初始化程序(或 setter 方法),因为来自在(包的)外部,您不能更改/设置未导出的字段。
参见相关问题:
再补充一点。结构的所有属性都应以大写字母 开头,如果它们应该在包外可见 。例如:
t := Thing
{
Name: "the name", // <-- This will work because Name start with capital letter
someUnexported: 23, // <-- this wont work because someUnexported starts with small letter
}