Dans Go, les assertions de type nommées sont utilisées pour tester si une valeur implémente une interface donnée. Cependant, cette approche ne s'applique pas directement aux types nommés qui redéfinissent des types prédéfinis avec un nouveau nom.
Considérez le code suivant :
<code class="go">type Answer string func acceptMe(str string) { fmt.Println(str) } func main() { type Answer string var ans Answer = "hello" // Type assertion fails: acceptMe(ans.(string)) // Conversion to underlying type succeeds: acceptMe(string(ans)) }</code>
L'assertion de type ans.(string ) échoue car il tente de vérifier si le type Answer implémente l’interface chaîne, ce qui n’est pas le cas. Au lieu de cela, Answer est un type personnalisé qui redéfinit la chaîne.
D'un autre côté, la chaîne de conversion (ans) réussit car elle convertit directement la valeur Answer en son type de chaîne sous-jacent. Puisque Answer est un type nommé pour la chaîne, cette conversion est toujours valide.
Pourquoi l'assertion de type ne fonctionne-t-elle pas pour les types nommés ?
Les assertions de type sont conçues pour interfaces. Une interface peut avoir plusieurs implémentations (appelées types concrets) et les assertions de type sont utilisées pour vérifier si une valeur implémente cette interface. Cependant, un type nommé a un type sous-jacent fixe, connu au moment de la compilation. Par conséquent, les assertions de type sont inutiles et ne peuvent pas être effectuées pour les types nommés.
Quand utiliser la conversion au lieu de l'assertion de type ?
Utilisez la conversion lorsque vous souhaitez convertir un type nommé. type à son type sous-jacent. Ceci est utile lorsque vous devez transmettre une valeur à une fonction ou une interface qui attend un type spécifique mais peut accepter son type sous-jacent.
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!