2013-01-01 9 views
5

Quando la decodifica JSON Ho sempre esplicitamente scritto una struct per ogni oggetto in modo che potessi implementare l'interfaccia Stringer per i singoli oggetti in una struttura genitore in questo modo:metodo su un campo struct di tipo definito da un tipo letterale

type Data struct { 
    Records []Record 
} 

type Record struct { 
    ID int 
    Value string 
} 

func (r Record) String() string { 
    return fmt.Sprintf("{ID:%d Value:%s}", r.ID, r.Value) 
} 

Recentemente ho appreso che è possibile fare il nesting con le strutture anonime. Questo metodo è molto più concisa per definire la struttura dei dati da decodificare:

type Data struct { 
    Records []struct { 
     ID int 
     Value string 
    } 
} 

Ma, è possibile definire un metodo su un membro di una struttura, in particolare un elemento che è uno struct anonima? Come l'implementazione dell'interfaccia Stringer nel primo blocco di codice.

risposta

6

No, i metodi possono essere associati solo ai tipi denominati definiti nello stesso pacchetto. Da specs:

Un metodo è una funzione con un ricevitore. Una dichiarazione di metodo associa un identificatore, il nome del metodo, a un metodo. Associa anche il metodo al tipo di base del ricevitore.

MethodDecl = "func" Receiver MethodName Signature [ Body ] . 
Receiver  = "(" [ identifier ] [ "*" ] BaseTypeName ")" . 
BaseTypeName = identifier . 

Il tipo di ricevitore deve essere nella forma T o * T dove T è un nome di tipo. Il tipo denotato da T è chiamato tipo di base del ricevitore; non deve essere un puntatore o un tipo di interfaccia e deve essere dichiarato nello stesso pacchetto del metodo. Il metodo si dice legato al tipo di base e il nome del metodo è visibile solo all'interno di selettori per quel tipo.

Il tipo del campo Records nel secondo esempio di OP è definito utilizzando un tipo letterale, es. la condizione di "tipo nome" sopra non è soddisfatta.

Problemi correlati