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

时间:2017-07-20 11:26:27

标签: go struct composite-literals

我有一个较大的结构,直到现在我才用struct literal语法进行实例化,例如:

Thing{
  "the name",
  ...
}

我刚刚在Thing结构中添加了一个未导出的字段,现在Go正在抱怨:implicit assignment of unexported field 'config' in Thing literal

有没有办法可以继续使用文字语法,即使现在结构上有一个未导出的字段?

2 个答案:

答案 0 :(得分:9)

如果在文字中使用键值,则只能使用composite literals创建另一个包中定义的结构类型的值,因为这样就不需要为所有文件提供初始值字段,因此您可以省略未导出的字段(只有声明包可以设置/更改)。

如果在同一个包中声明了类型,您也可以设置未导出的字段:

t := Thing{
    Name:           "the name",
    someUnexported: 23,
}

但是如果在另一个包中声明了类型,那么你只能为导出的字段提供初始值,我猜这不足为奇:

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

如果你需要struct的值,其中未导出的字段的值不是其类型的零值,那么包本身必须导出某种构造函数或初始化器(或setter方法),因为从包的外部),您无法更改/设置未导出的字段。

请参阅相关问题:How to clone a structure with unexported field?

答案 1 :(得分:6)

还要补充一点。结构的所有属性都应以大写字母开头,例如:

def keepDate(dates: List[String], component: DateComponent = DateComponent.YYYYMMDD) = {
  rdd.filter(r => dates.contains(ExtractDate(r.getCrawlDate, component)))
}