Conversion d'interface nulle en pointeur dans Go
Dans Go, un type d'interface peut contenir des valeurs de différents types concrets qui l'implémentent. Cependant, tenter de convertir une interface nulle en un pointeur d'un type spécifique peut entraîner l'erreur « conversion d'interface : l'interface est nulle, pas *
Pour comprendre ce comportement, considérez l'extrait de code de la question :
type Nexter interface { Next() Nexter } type Node struct { next Nexter } func (n *Node) Next() Nexter {...} func main() { var p Nexter var n *Node fmt.Println(n == nil) // True n = p.(*Node) // Error: interface conversion: interface is nil, not *main.Node }
Le problème survient lorsque l'on tente d'attribuer la valeur de p à n en utilisant l'assertion de type p.(*Node). Cette assertion échoue car la variable p est nulle, indiquant qu'elle ne contient aucune valeur concrète.
Alternativement, l'expression suivante :
n = (*Node)(nil)
réussit car elle définit explicitement la variable n sur un pointeur nul de type *Node. Ceci est possible car une valeur d'interface se compose d'une paire de (valeur, type dynamique) et la définition d'une valeur d'interface sur nil entraînera une paire de (nil, nil).
Pour gérer les valeurs d'interface nulles, vous pouvez le vérifier explicitement :
if p != nil { n = p.(*Node) // Only succeeds if `p` holds a value of type `*Node` }
Vous pouvez également utiliser la forme "virgule-ok" de l'assertion de type :
if n, ok := p.(*Node); ok { fmt.Printf("n=%#v\n", n) // Never fails, assigns zero value to `n` if `p` is nil }
Dans En conclusion, tenter de convertir une interface nil en un pointeur d'un type spécifique à l'aide de l'assertion de type échouera, mais la définir explicitement sur nil réussira. Pour gérer les valeurs d'interface nulles, des vérifications explicites ou la forme d'assertion de type "virgule-ok" peuvent être utilisées.
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!