2017-07-20 3 views
4

ich eine ziemlich große Struktur haben, die gerade jetzt, bis ich mit der Struktur Literalsyntax wurde instanziiert wird, zB:Golang struct Literalsyntax mit unexported Felder

Thing{ 
    "the name", 
    ... 
} 

Ich habe hinzugefügt, nur ein unexported Feld die Thing struct und nun beschwert sich Go: implicit assignment of unexported field 'config' in Thing literal.

Gibt es eine Möglichkeit, die literale Syntax weiterhin zu verwenden, obwohl es jetzt ein nicht exportiertes Feld in der Struktur gibt?

Antwort

4

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?

0

einen weiteren Punkt hinzuzufügen. Alle Eigenschaften einer Struktur sollten mit Großbuchstaben beginnen, zum Beispiel:

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 
}