Maison >développement back-end >Golang >Comment convertir en toute sécurité une interface Nil en pointeur dans Go ?

Comment convertir en toute sécurité une interface Nil en pointeur dans Go ?

DDD
DDDoriginal
2024-12-19 14:01:16184parcourir

How to Safely Convert a Nil Interface to a Pointer in Go?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn