2014-10-19 4 views
5

ho pensato che sarei in grado di fare un tipo di mappa ordinata utilizzando i campi anonimi:golang campo anonima del tipo di mappa

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

dove ho potuto fare riferimento alla mappa con la customMapInstance["key"] e iterare ordered. Purtroppo, sembra che le matrici e le mappe non siano campi anonimi validi. Ho il sospetto che ci sia una buona ragione ...

+0

Potete vedere qui (http://stackoverflow.com/a/26194639/6309) un altro tentativo di incorporare un tipo senza nome. Anche fallito. – VonC

risposta

6

Dal spec:

Un incassato deve essere specificato come un nome di tipo T o come un puntatore a un nome di tipo non-interfaccia * T e T stesso potrebbe non essere un tipo di puntatore.

Si vede che si parla di un "nome tipo".

I tipi denominati sono specificati da un nome di tipo (possibilmente qualificato); i tipi senza nome vengono specificati utilizzando un letterale di tipo, che compone un nuovo tipo da tipi esistenti.

In altre parole, una mappa o una sezione non possono essere anonimi a meno che non siano definiti come un tipo con nome. Per esempio:

type MyMap map[string]string 

type customMap struct{ 
    MyMap 
    ordered []string 
} 

Tuttavia, anche se si incorpora MyMap o un tipo slice, si sarebbe non essere ancora in grado di indicizzare customMap. Solo i campi e i metodi possono essere "promossi" quando si incorpora. Per tutto il resto si comportano come un altro campo. Nell'esempio di cui sopra, MyMap non ha alcun campo o metodi e quindi equivale a:

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

In realtà avevo provato a nominare prima di incorporarlo, ma purtroppo. Non ho visto l'implementazione, ma l'indicizzazione di una mappa sembra chiamare una funzione 'm.hashTableLookup (key interface {})', nel qual caso potrebbe essere promossa, sì? Stessa cosa per i canali e l'invio/ricezione. Sarebbe davvero grandioso se potessi usare la bella sintassi '[]' e '<-' direttamente sulle strutture. – Ethan

+0

Questo non è come Python o altri linguaggi dinamici in cui la sintassi dell'indicizzazione è una chiamata a un metodo magico. Usare [] o <- direttamente su una struttura è impossibile. –