Maison  >  Article  >  développement back-end  >  Pourquoi l’assertion de type échoue-t-elle avec les types personnalisés dans Go, mais la conversion réussit-elle ?

Pourquoi l’assertion de type échoue-t-elle avec les types personnalisés dans Go, mais la conversion réussit-elle ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-04 07:14:02633parcourir

Why Does Type Assertion Fail with Custom Types in Go, But Conversion Succeeds?

Assertions et conversions de types nommés dans Go

Dans Go, les assertions et conversions de types nommés permettent aux développeurs de manipuler des types de données personnalisés et prédéfinis. Cependant, des idées fausses peuvent survenir lorsqu'il s'agit de types personnalisés qui redéfinissent des types prédéfinis. Explorons ce problème en détail.

Considérons l'exemple de code suivant :

<code class="go">type Answer string

func acceptMe(str string) {
    fmt.Println(str)
}

func main() {
    type Answer string
    var ans Answer = "hello"

    // Illegal usage
    acceptMe(ans)

    // Failed type assertion
    acceptMe(ans.(string))

    // Works (but why?)
    acceptMe(string(ans))
}</code>

Q : Pourquoi l'assertion de type (ans.(string)) échoue-t-elle, alors que la conversion (string(ans)) fonctionne ?

A : Les assertions de type ne s'appliquent qu'aux types d'interface, qui représentent un contrat qu'une valeur peut remplir. Étant donné que les types personnalisés comme Answer ne sont pas des interfaces, tenter de les affirmer à l'aide de la syntaxe d'assertion de type entraînera une erreur.

En revanche, les conversions transforment explicitement un type en un autre. La conversion (string(ans)) réussit car Answer a un type de chaîne sous-jacent. Go convertit implicitement Ans en sa chaîne sous-jacente avant de la transmettre à acceptMe.

Notes supplémentaires :

  • Les types personnalisés comme Answer sont essentiellement des alias pour les types existants. Ils n'ajoutent pas de nouvelles fonctionnalités ou comportements.
  • Les assertions de type fournissent une vérification de type à l'exécution, tandis que les conversions effectuent une coercition de type implicite.
  • Lorsqu'il s'agit de types personnalisés qui encapsulent des types prédéfinis, il est généralement recommandé d'utiliser conversions au lieu d'assertions de type, car elles sont plus efficaces et réussissent toujours si les types sous-jacents correspondent.

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