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
Libérer: 2024-12-19 14:01:16
original
191 Les gens l'ont consulté

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
}
Copier après la connexion

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)
Copier après la connexion

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
}
Copier après la connexion

Alternativement, le formulaire « virgule-ok » offre une option plus sûre :

if n, ok := p.(*Node); ok {
    fmt.Printf("n=%#v\n", n)
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal