jbr*_*own 5 struct go composite-literals
我有一个较大的结构,直到刚才我用struct literal语法实例化,例如:
Thing{
"the name",
...
}
Run Code Online (Sandbox Code Playgroud)
我刚刚添加了一个未导出的字段Thing结构,现在Go正在抱怨:implicit assignment of unexported field 'config' in Thing literal.
有没有什么方法可以继续使用文字语法,即使结构上现在有一个未导出的字段?
icz*_*cza 11
如果在文字中使用键控值,则只能使用复合文字来创建在另一个包中定义的结构类型的值,因为这样就不需要为所有字段提供初始值,因此可以省略未导出的字段(仅限于声明包可以设置/更改).
如果类型在同一个包中声明,您也可以设置未导出的字段:
t := Thing{
Name: "the name",
someUnexported: 23,
}
Run Code Online (Sandbox Code Playgroud)
但是如果在另一个包中声明了类型,那么你只能为导出的字段提供初始值,我猜这不足为奇:
t := otherpackage.Thing{
Name: "the name",
// someUnexported will implicitly be its zero value
}
Run Code Online (Sandbox Code Playgroud)
如果你需要struct的值,其中未导出的字段具有除其类型的零值以外的值,则包本身必须导出某种构造函数或初始化器(或setter方法),因为从外部(包的),你无法更改/设置未导出的字段.
请参阅相关问题:如何使用未导出的字段克隆结构?
小智 5
还有一点要补充.结构的所有属性应以大写字母开头,例如:
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
}
Run Code Online (Sandbox Code Playgroud)