102 votes

Que signifient 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 sais 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.

147voto

zzzz Points 23017

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

Il s'agit d'une construction pratique lorsque le développement et l'ensemble des méthodes d'une interface et/ou les méthodes implémentées par un type sont fréquemment modifiés. Cette construction permet d'éviter d'oublier de faire correspondre les ensembles de méthodes d'un type et d'une interface lorsque l'intention est de les rendre compatibles. Elle empêche efficacement de go install une version brisée (intermédiaire) avec cette omission.

31voto

val Points 5965

Il semble que vous créez une valeur fictive de type ValueConverter en attribuant un nouveau boolType et de le rejeter (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'indice de l'énumération).

A mon avis, cela correspond simplement à une vérification statique pour s'assurer que la structure boolType met en œuvre le ValueConverter l'interface. Ainsi, lorsque vous modifiez l'implémentation de boolType le compilateur se plaindra prématurément si vous avez cassé l'implémentation de la fonction ValueConverter car elle ne sera pas en mesure d'intégrer votre nouvelle interface. boolType à cette interface.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X