Assertions de type nommé et conversions dans Go
Considérez le scénario suivant dans lequel un type personnalisé est défini pour redéfinir un type prédéfini :
<code class="go">type Answer string</code>
Maintenant, essayons d'utiliser ce type personnalisé dans une fonction qui accepte le type prédéfini d'origine :
<code class="go">func acceptMe(str string) { fmt.Println(str) } func main() { type Answer string var ans Answer = "hello" // Type assertion fails acceptMe(ans.(string)) // Conversion works acceptMe(string(ans)) }</code>
L'assertion de type ans.(string) échoue avec l'erreur : assertion de type non valide : ans.(string) (réponse de type non-interface à gauche). En revanche, la conversion string(ans) réussit. Ce comportement soulève la question :
Pourquoi l'assertion de type échoue-t-elle, mais la conversion fonctionne ?
Pour comprendre cela, clarifions que les assertions de type ne fonctionnent que pour les interfaces. Une interface peut avoir des types sous-jacents arbitraires, ce qui rend les assertions de type et les commutateurs de type essentiels. Les assertions de type renvoient une valeur booléenne avec le résultat, indiquant le succès de l'assertion.
En revanche, votre type personnalisé Answer a un type sous-jacent fixe, qui est une chaîne. Puisque vous connaissez déjà les types exacts, vous n'avez pas besoin d'assertions de type car la conversion de Réponse en chaîne réussira toujours. La syntaxe de cette conversion est string(ans).
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!