web-dev-qa-db-fra.com

Que signifie un trait de soulignement et un nom d'interface après le mot clé var?

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

Je savais que ValueConverter est un nom d'interface. La ligne 58 semble déclarer que boolType implémente l'interface ValueConverter, mais est-ce nécessaire? J'ai supprimé la ligne 58 et le code fonctionne bien.

71
dilfish

Il fournit une vérification statique (au moment de la compilation) que boolType satisfait l'interface ValueConverter. Le _ utilisé comme nom de la variable indique au compilateur de supprimer efficacement la valeur RHS, mais de la vérifier et de l'évaluer si elle a des effets secondaires, mais la variable anonyme en soi ne prend pas d'espace de processus.

C'est une construction pratique lors du développement et l'ensemble de méthodes d'une interface et/ou les méthodes implémentées par un type sont fréquemment modifiées. La construction sert de garde contre l'oubli de faire correspondre les ensembles de méthodes d'un type et d'une interface où l'intention est de les rendre compatibles. Il empêche efficacement go install une version cassée (intermédiaire) avec une telle omission.

97
zzzz

Il semble que vous créez une valeur fictive de type ValueConverter, en lui affectant un nouvel objet boolType puis en le supprimant (ce qui est la signification du trait de soulignement dans go, comme dans for _, elt := range myRange { ...} si vous n'êtes pas intéressé par l'index de l'énumération).

Je suppose que cela correspond simplement à une vérification statique pour s'assurer que la structure boolType implémente l'interface ValueConverter. De cette façon, lorsque vous modifiez l'implémentation de boolType, le compilateur se plaindra tôt si vous avez interrompu l'implémentation de l'interface ValueConverter car il ne pourra pas convertir votre nouveau boolType en cette interface.

20
val