What does an underscore and interface name after keyword var mean?

80

From 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) {....}

I known that ValueConverter is an interface name. Line 58 seems to declare that boolType implement interface ValueConverter, but is that necessary? I deleted line 58 and the code works well.

dilfish
fuente
El identificador en blanco también _ se puede usar para proporcionar estrictamente las claves en una estructura. Vea esto como referencia
Vallie

Respuestas:

121

Proporciona una comprobación estática (tiempo de compilación) que boolTypesatisface la ValueConverterinterfaz. El _usado como nombre de la variable le dice al compilador que descarte efectivamente el valor RHS, pero que lo verifique y evalúe si tiene algún efecto secundario, pero la variable anónima per se no ocupa ningún espacio de proceso.

Es una construcción útil cuando se desarrolla y el conjunto de métodos de una interfaz y / o los métodos implementados por un tipo se cambian con frecuencia. La construcción sirve como una protección contra el olvido de hacer coincidir los conjuntos de métodos de un tipo y de una interfaz donde la intención es que sean compatibles. Previene eficazmente a go installuna versión rota (intermedia) con tal omisión.

zzzz
fuente
27

Parece que está creando un valor ficticio de tipo ValueConverter, asignándole un nuevo boolTypeobjeto y luego descartándolo (que es el significado del guión bajo en go, como enfor _, elt := range myRange { ...} si no estuviera interesado en el índice de la enumeración).

Supongo que simplemente corresponde a una verificación estática para garantizar que la estructura boolTypeimplemente la ValueConverterinterfaz. De esta manera, cuando cambie la implementación de boolType, el compilador se quejará temprano si rompió la implementación de la ValueConverterinterfaz, ya que no podrá enviar su nueva boolTypea esta interfaz.

val
fuente