Conversion d'une interface nulle en pointeur d'un type dans Golang
Lors de la tentative de conversion d'une interface nulle en un pointeur d'un type spécifique, un une erreur se produit : "conversion d'interface : l'interface est nulle". Pour comprendre pourquoi cela échoue, il est important de saisir la distinction entre les types statiques et dynamiques.
Nexter est une interface qui spécifie un type statique. Les variables de type Nexter peuvent contenir des valeurs de différents types dynamiques qui implémentent l'interface Nexter, tels que *Node ou d'autres types personnalisés. Lorsqu'une variable d'interface nulle est affectée à une variable de pointeur, il est impossible de déterminer le type dynamique réel de la valeur qu'elle contient (puisqu'elle n'en contient aucun).
En conséquence, l'assertion de type, qui est généralement utilisée dans la forme x.(T) pour affirmer que x est de type T et le convertir en T, échoue. En effet, la spécification du langage Go indique explicitement que x.(T) ne fonctionne que lorsque x n'est pas nul. L'utilisation d'une assertion de type sur une variable d'interface nulle entraînera une panique d'exécution.
Pour obtenir un effet similaire à n = p.(*Node) mais à partir d'une interface nulle, l'approche suivante peut être utilisée :
var p Nexter = (*Node)(nil)
Une valeur d'interface contient en fait une paire de (valeur, type dynamique). Dans ce cas, p n'est pas nul mais contient une paire de (nil, *Node). Cela permet à l'assertion de type sur p de réussir.
Alternativement, pour gérer explicitement les valeurs nulles, utilisez la forme « virgule-ok » :
if n, ok := p.(*Node); ok { fmt.Printf("n=%#v\n", n) }
La forme « virgule-ok » garantit que aucune panique à l'exécution ne se produit et ok sera faux si l'assertion échoue (c'est-à-dire que p contient une valeur nulle ou une valeur d'un type différent).
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!