Was bedeutet ein Unterstrich und ein Schnittstellenname nach dem Schlüsselwort var?

79

Von http://golang.org/src/pkg/database/sql/driver/types.go :

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

var Bool boolType

type boolType struct{}

var _ ValueConverter = boolType{} // line 58

func (boolType) String() string { return "Bool" }

func (boolType) ConvertValue(src interface{}) (Value, error) {....}

Ich wusste, dass ValueConverter ein Schnittstellenname ist. Zeile 58 scheint zu deklarieren, dass boolType die Schnittstelle ValueConverter implementiert, aber ist das notwendig? Ich habe Zeile 58 gelöscht und der Code funktioniert gut.

Dilfish
quelle
Die leere Kennung _ kann auch verwendet werden, um die Schlüssel in einer Struktur strikt bereitzustellen. Siehe dies als Referenz
Vallie

Antworten:

116

Es bietet eine statische Prüfung (Kompilierungszeit), boolTypedie die ValueConverterSchnittstelle erfüllt . Der _als Name der Variablen verwendete Wert weist den Compiler an, den RHS-Wert effektiv zu verwerfen, ihn jedoch zu überprüfen und zu bewerten, ob er Nebenwirkungen hat, aber die anonyme Variable an sich benötigt keinen Prozessraum.

Es ist ein praktisches Konstrukt beim Entwickeln und der Methodensatz einer Schnittstelle und / oder die von einem Typ implementierten Methoden werden häufig geändert. Das Konstrukt schützt vor dem Vergessen, die Methodensätze eines Typs und einer Schnittstelle abzugleichen, bei denen die Kompatibilität beabsichtigt ist. Es verhindert effektiv go installeine kaputte (Zwischen-) Version mit einer solchen Auslassung.

zzzz
quelle
27

Es scheint, als würden Sie einen Dummy-Wert vom Typ erstellen ValueConverter, ihm ein neues boolTypeObjekt zuweisen und es dann verwerfen (was die Bedeutung des Unterstrichs in go ist, als for _, elt := range myRange { ...}ob Sie nicht am Index der Aufzählung interessiert wären).

Ich vermute, dass es einfach einer statischen Überprüfung entspricht, um sicherzustellen, dass die Struktur boolTypedie ValueConverterSchnittstelle implementiert . Auf diese Weise boolTypebeschwert sich der Compiler beim Ändern der Implementierung von frühzeitig, wenn Sie die Implementierung der ValueConverterSchnittstelle unterbrochen haben, da er Ihre neue nicht boolTypein diese Schnittstelle umwandeln kann.

val
quelle