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 :
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!