2012-11-02 15 views
37
http://golang.org/src/pkg/database/sql/driver/types.go 

30 type ValueConverter interface { 
31  // ConvertValue converts a value to a driver Value. 
32  ConvertValue(v interface{}) (Value, error) 
33 } 

54 var Bool boolType 
55 
56 type boolType struct{} 
57 
58 var _ ValueConverter = boolType{} 
59 
60 func (boolType) String() string { return "Bool" } 
61 
62 func (boolType) ConvertValue(src interface{}) (Value, error) {....} 

Come sopra, ho saputo che ValueConverter è un nome di interfaccia, la riga 58 sembra dichiarare che l'interfaccia di strumento boolType ValueConverter, è necessario? Ho cancellato la riga 58, il codice funziona benecosa significa un underscore e il nome dell'interfaccia dopo la parola chiave var in golang?

+0

[vedere anche] (http://stackoverflow.com/q/12843132/720999) – kostix

+12

Probabilmente è ora di accettare una di quelle risposte ora. –

risposta

60

Fornisce un controllo statico (in fase di compilazione) che boolType soddisfa l'interfaccia ValueConverter. Il _ usato come nome della variabile dice al compilatore di scartare efficacemente il valore RHS, ma di digitarlo e valutarlo se ha effetti collaterali, ma la variabile anonima di per sé non occupa spazio di processo.

È un costrutto utile durante lo sviluppo e il set di metodi di un'interfaccia e/o dei metodi implementati da un tipo vengono spesso modificati. Il costrutto serve da protezione contro il dimenticare di abbinare le serie di metodi di un tipo e di un'interfaccia in cui l'intento è quello di renderle compatibili. Previene efficacemente a go install una versione (intermedia) interrotta con tale omissione.

16

Sembra che si sta creando un valore fittizio di tipo ValueConverter, l'assegnazione di un nuovo boolType oggetto ad esso e poi scartando esso (che è il significato della sottolineatura in movimento, come in for _, elt := range myRange { ...} se non siete interessati nell'indice dell'enumerazione).

La mia ipotesi è che corrisponda semplicemente a un controllo statico per garantire che la struttura boolType implementa l'interfaccia ValueConverter. In questo modo, quando si modifica l'implementazione di boolType, il compilatore si lamenterà in anticipo se si è interrotta l'implementazione dell'interfaccia ValueConverter in quanto non sarà in grado di trasmettere il nuovo boolType a questa interfaccia.

+0

ok, capisco. grazie. Hai dato una spiegazione pulita – dilfish