Sie können nur composite literals verwenden, um Werte von Strukturtypen in einem anderen Paket definiert zu erstellen, wenn Sie Schlüsselwerte im wörtlichen verwenden, weil dann Anfangswerte für alle Felder zur Verfügung zu stellen Sie sind nicht erforderlich, und so kann man auslassen nicht exportierte Felder (die nur das Deklarationspaket setzen/ändern kann).
Wenn der Typ in der gleichen Verpackung deklariert ist, können Sie auch unexported Felder gesetzt:
t := Thing{
Name: "the name",
someUnexported: 23,
}
Aber Sie können nur die Anfangswerte für exportierte Felder zur Verfügung stellen, wenn der Typ in einem anderen Paket deklariert wird, was nicht ist eine Überraschung ich denke:
t := otherpackage.Thing{
Name: "the name",
// someUnexported will implicitly be its zero value
}
Wenn Sie Werte der Struktur brauchen, wo die unexported Felder andere Werte als den Nullwert ihrer Typen haben, das Paket selbst muss irgendeine Art von Konstruktor oder initializer (oder Setter-Methode) exportieren , weil von den Outs ide (des Pakets), können Sie nicht exportierte Felder nicht ändern/setzen.
Siehe ähnliche Frage: How to clone a structure with unexported field?