2012-11-02 11 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) {....} 

Jak wyżej, wiem, że ValueConverter jest nazwą interfejsu, linia 58 wydaje się deklarować, że interfejs implementacyjny boolType ValueConverter, czy to konieczne? Usunąłem linię 58, kod działa dobrzeco oznacza podkreślenie i nazwa interfejsu po słowie kluczowym var w języku golang?

+0

[patrz również] (http://stackoverflow.com/q/12843132/720999) – kostix

+12

Prawdopodobnie jest czas, aby zaakceptować jedną z tych odpowiedzi. –

Odpowiedz

60

Zapewnia sprawdzenie statyczne (czas kompilacji), czy boolType spełnia wymagania interfejsu ValueConverter. Nazwa _ używana jako nazwa zmiennej mówi kompilatorowi, aby skutecznie odrzucił wartość RHS, ale aby ją sprawdzić i ocenić, jeśli ma jakieś skutki uboczne, ale anonimowa zmienna per se nie zajmuje żadnej przestrzeni procesu.

Jest to poręczna konstrukcja podczas tworzenia i zestaw metod interfejsu i/lub metod zaimplementowanych przez typ są często zmieniane. Konstrukcja służy jako ochrona przed zapominaniem, aby dopasować zestawy metod typu i interfejsu, w którym intencją jest ich kompatybilność. Zapobiega on skutecznie rozwiązaniu (pośredniej) wersji z takim pominięciem.

16

Wydaje się, że tworzysz atrapę wartość typu ValueConverter, przypisując nowy boolType obiekt do niego, a następnie odrzucając go (co jest znaczenie podkreślenia w ruchu, jak w for _, elt := range myRange { ...} jeśli nie jesteś zainteresowany w indeksie wyliczenia).

Zgaduję, że po prostu odpowiada to statycznej kontroli, aby upewnić się, że struktura implementuje interfejs ValueConverter. W ten sposób, po zmianie implementacji boolType, kompilator będzie skarżył się wcześniej, jeśli przerwiesz implementację interfejsu ValueConverter, ponieważ nie będzie on mógł przesłać nowego interfejsu boolType do tego interfejsu.

+0

ok, widzę. Dziękuję Ci. Dałeś czyste wyjaśnienie – dilfish