Golang结构体字面量语法与未公开字段

9

我有一个相当大的结构体,直到刚才我一直在使用结构体字面量语法进行实例化,例如:

Thing{
  "the name",
  ...
}

我刚刚给Thing结构体添加了一个未导出的字段,现在Go在抱怨:隐式赋值Thing文字中未导出的字段“config”

即使在结构体上有一个未导出的字段,是否有任何方法可以继续使用字面量语法?

2个回答

18
您只能使用复合字面量来创建另一个包中定义的结构类型的值,如果在字面量中使用了键控值,那么您不需要为所有字段提供初始值,因此可以省略未公开的字段(只有声明包才能设置/更改)。
如果该类型在同一包中声明,则也可以设置未公开字段:
t := Thing{
    Name:           "the name",
    someUnexported: 23,
}

但是,如果类型在另一个包中声明,你只能为导出字段提供初始值,这并不令人惊讶:

t := otherpackage.Thing{
    Name: "the name",
    // someUnexported will implicitly be its zero value
}

如果您需要访问包含非零值的未公开字段的结构体的值,那么该包必须导出某种构造函数、初始化程序或设置方法,因为在包的外部,您无法更改/设置未公开字段。请参阅相关问题:如何克隆具有未导出字段的结构体?

11

还有一点需要补充。如果一个结构体的属性需要在包外可见,那么所有属性都应该以大写字母开头。例如:

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
}

8
这不是真的。当字段仅在声明它的包中访问时,它可以以小写字母开头。 - begie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接