带有未导出字段的Golang结构文字语法

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)

  • 这不是真的。如果要从声明其的包中“仅**”访问该字段,则该字段可以以小写字母开头。 (2认同)