Conversion d'interfaces nulles en pointeurs dans Go
Dans Go, la conversion d'une interface nulle en pointeur d'un type spécifique peut entraîner une erreur . Dans l'exemple de code fourni :
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) // prints true n = p.(*Node) // fails }
Cela échoue car une interface statique (Nexter) peut contenir des valeurs de différents types dynamiques, y compris nul. L'assertion de type (p.(*Node)) ne peut pas être effectuée sur une valeur d'interface nulle.
Cependant, il est possible d'attribuer directement une valeur nulle à un pointeur d'un type spécifique :
n = (*Node)(nil)
Cela attribue une valeur nulle avec le type dynamique *Node à n.
Pour gérer les valeurs d'interface nulles, vous pouvez les vérifier explicitement :
if p != nil { n = p.(*Node) // only succeeds if p contains a value of type *Node }
Vous pouvez également utiliser le formulaire "virgule-ok" :
if n, ok := p.(*Node); ok { // n is not nil and holds a value of type *Node }
L'utilisation du formulaire "virgule-ok" garantit que l'assertion n'échoue jamais et renvoie un booléen indiquant si l'affirmation tient au lieu de provoquer la panique. Cela vous permet de gérer en toute sécurité les valeurs d'interface nulles et non nulles.
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!