Maison > développement back-end > Golang > Pourquoi une conversion d'interface nulle en pointeur échoue-t-elle en Go ?

Pourquoi une conversion d'interface nulle en pointeur échoue-t-elle en Go ?

Barbara Streisand
Libérer: 2024-11-30 13:08:11
original
452 Les gens l'ont consulté

Why Does a Nil Interface to Pointer Conversion Fail in Go?

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 * ». Cette erreur se produit car l'assertion de type, qui est utilisée pour convertir une interface en un type spécifique, nécessite une valeur d'interface non nulle.

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

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

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

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

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!

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal