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

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

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

但如果类型在另一个包中声明,您只能为导出字段提供初始值,我想这并不奇怪:

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

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