Maison  >  Article  >  développement back-end  >  Pourquoi l'assertion de type échoue-t-elle lors de l'implémentation des interfaces « Valuer » et « Scanner » dans Go ?

Pourquoi l'assertion de type échoue-t-elle lors de l'implémentation des interfaces « Valuer » et « Scanner » dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-06 20:00:04345parcourir

Why Does Type Assertion Fail When Implementing `Valuer` and `Scanner` Interfaces in Go?

Comprendre les assertions de type Golang

Dans Go, on peut définir des types personnalisés basés sur des types existants à l'aide d'alias de type. Dans le scénario donné, le type Role est un alias pour le type chaîne intégré. Cependant, lors de l'implémentation des interfaces Valuer et Scanner pour ce type personnalisé, une erreur est rencontrée.

Résoudre l'erreur

Le message d'erreur suggère qu'il y a un problème avec la conversion de type dans la méthode Scan. Plus précisément, il se plaint de la tentative d'attribuer la valeur convertie à un pointeur vers un rôle.

La première fonction, Scan, est chargée d'extraire une valeur de la base de données et de la convertir au type approprié. Le problème réside dans la ligne d'affectation :

r = (*Role)(value.(string))

L'expression value.(string) tente de convertir le paramètre value en chaîne. Cependant, l'affectation tente ensuite d'attribuer cette valeur convertie à un pointeur vers un rôle. Ceci est incorrect, car la destination doit être de type *Role et non Role. Le code corrigé est :

func (r *Role) Scan(value interface{}) error {
    *r = Role(value.(string))
    return nil
}

La deuxième fonction, Value, est chargée de convertir une valeur dans un format compatible avec la base de données. Le code donné est incorrect car il ne suit pas la signature de fonction attendue pour driver.Valuer. Le code corrigé est :

func (r Role) Value() (driver.Value, error) {
    return string(r), nil
}

Conclusion

En corrigeant la conversion de type dans la méthode Scan et en ajustant la signature de fonction dans la méthode Value, le code devrait fonctionner comme prévu, permettant au type de rôle personnalisé d'interagir avec le pilote de base de données.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn