Erreur de conversion d'interface nulle en pointeur dans GoLang
Dans GoLang, tentative de conversion d'une interface nulle en pointeur d'un type spécifique, comme illustré ci-dessous, déclenche une erreur :
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 }
Cette erreur se produit car une variable de type statique de type interface (par exemple, Nexter) peut contenir des valeurs de différents types dynamiques, y compris zéro. Bien qu'il soit possible de convertir une valeur nulle en pointeur à l'aide de (*Node)(nil), l'assertion de type utilisée dans l'exemple ne peut pas être appliquée car :
x.(T)
exige que x soit non- nil et de type T. Dans ce cas, p peut contenir des valeurs de différents types ou nul.
Au lieu de cela, des vérifications explicites peuvent être employé :
if p != nil { n = p.(*Node) // succeeds if p contains a *Node value }
Alternativement, le formulaire « virgule-ok » offre une option plus sûre :
if n, ok := p.(*Node); ok { fmt.Printf("n=%#v\n", n) }
L'utilisation du formulaire « virgule-ok » permet de gérer à la fois les valeurs nulles et non- valeurs d'interface nulles sans déclencher de panique.
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!