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

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 weiß, dass ValueConverter ein Interface-Name ist. Zeile 58 scheint zu erklären, dass boolType Interface ValueConverter implementiert, aber ist das notwendig? Ich habe Zeile 58 gelöscht und der Code funktioniert gut.

Es bietet eine statische (Kompilierzeit) Überprüfung, dass boolType die ValueConverter Schnittstelle erfüllt. Das _ das als Name der Variablen verwendet wird, weist den Compiler an, den RHS-Wert effektiv zu vercasting, aber es zu prüfen und zu bewerten, wenn es irgendwelche Nebenwirkungen hat, aber die anonyme Variable per se nimmt keinen processraum.

Es ist ein handliches Konstrukt bei der Entwicklung und der Methodensatz einer Schnittstelle und / oder die von einem Typ implementierten Methoden werden häufig geändert. Das Konstrukt dient als Schutz gegen das Vergessen, die Methodensätze eines Typs und einer Schnittstelle zu finden, deren Kompatibilität beabsichtigt ist. Es verhindert effektiv, eine unterbrochene (Zwischen-) Version mit einer solchen Unterlassung zu go install .

Es ValueConverter , als ob Sie einen Dummy-Wert vom Typ ValueConverter , ihm ein neues boolType Objekt boolType und ihn dann vercasting (was die Bedeutung des Unterstrichs in go bedeutet, wie bei for _, elt := range myRange { ...} wenn Sie nicht am Index der Aufzählung interessiert sind.

Meine Vermutung ist, dass es einfach einer statischen Überprüfung entspricht, um sicherzustellen, dass die Struktur boolType die ValueConverter Schnittstelle implementiert. Wenn Sie die Implementierung von boolType , wird sich der Compiler auf diese Weise früh beschweren, wenn Sie die Implementierung der ValueConverter Schnittstelle ValueConverter , da es nicht möglich ist, Ihren neuen boolType für diese Schnittstelle zu verwenden.