2014-10-19 10 views
5

Ich dachte, ich wäre in der Lage, eine geordnete Kartentyp zu machen, indem anonyme Felder:golang anonymes Feld vom Typ Karte

type customMap struct{ 
    map[string]string 
    ordered []string 
} 

, wo ich die Karte mit customMapInstance["key"] verweisen konnte und iterieren ordered. Leider scheinen Arrays und Maps keine anonymen Felder zu sein. Ich vermute, es gibt einen guten Grund ...

+0

Sie hier sehen können (http://stackoverflow.com/a/26194639/6309) einen weiteren Versuch in eine Einbettung unbenannter Typ Es ist auch gescheitert. – VonC

Antwort

6

Von der Spezifikation:

Ein eingebetteter Typ als Typname T angegeben werden muss oder als Zeiger auf einen nicht-Interface-Typen Namen * T und T selbst darf kein Zeigertyp sein.

Sie sehen, dass es einen "Typnamen" erwähnt.

Benannte Typen werden durch einen (möglicherweise qualifizierten) Typnamen angegeben; unbenannte Typen werden mit einem Typliteral angegeben, das aus vorhandenen Typen einen neuen Typ zusammensetzt.

Mit anderen Worten, eine Zuordnung oder ein Slice darf nicht anonym sein, es sei denn, sie sind als benannter Typ definiert. Zum Beispiel:

type MyMap map[string]string 

type customMap struct{ 
    MyMap 
    ordered []string 
} 

Aber auch wenn Sie MyMap oder eine Scheibe Art einbetten, würden Sie noch nicht zu indizieren customMap können. Nur Felder und Methoden können beim Einbetten "befördert" werden. Für alles andere sind sie nur ein weiteres Feld. In dem obigen Beispiel hat MyMap keine Felder oder Methoden und somit entspricht:

type customMap struct{ 
    MyMap MyMap 
    ordered []string 
} 
+0

Ich hatte tatsächlich versucht, vor dem Einbetten zu benennen, aber leider. Ich habe mir die Implementierung nicht angesehen, aber das Indizieren einer Map klingt wie das Aufrufen einer 'm.hashTableLookup (Schlüsselschnittstelle {})' -Funktion, in diesem Fall könnte sie möglicherweise gefördert werden, ja? Das Gleiche gilt für Kanäle und Senden/Empfangen. Es wäre wirklich toll, wenn Sie die schöne Syntax '[]' und '<-' direkt in Strukturen verwenden könnten. – Ethan

+0

Dies ist nicht wie bei Python oder anderen dynamischen Sprachen, bei denen die Indiziersyntax ein Aufruf einer magischen Methode ist. Verwenden von [] oder <- direkt auf einer Struktur ist unmöglich. –