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.
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.
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.