Maison > développement back-end > Golang > Pourquoi est-ce que j'obtiens l'erreur « Impossible de saisir le commutateur sur une valeur non-interface » dans Golang ?

Pourquoi est-ce que j'obtiens l'erreur « Impossible de saisir le commutateur sur une valeur non-interface » dans Golang ?

Susan Sarandon
Libérer: 2024-11-13 04:40:02
original
947 Les gens l'ont consulté

Why Do I Get the

Erreur : "Impossible de saisir le commutateur sur une valeur non-interface" dans Golang

Lorsque vous travaillez avec des assertions de type, vous pouvez rencontrer l'erreur " Je ne peux pas taper sur une valeur non-interface." Cela se produit lorsque vous tentez d'effectuer un changement de type sur une valeur qui n'est pas une interface.

Dans Golang, le changement de type vous permet d'exécuter du code de manière conditionnelle en fonction du type d'une variable. Cependant, cela nécessite que la variable soit de type interface. Une interface représente un contrat qui définit un ensemble de méthodes qu'un type d'implémentation doit implémenter.

Dans l'extrait de code fourni, un type nommé Stringer est défini avec une seule méthode String(). Le type Number implémente également la méthode String(), ce qui en fait une implémentation concrète de l'interface Stringer.

type Stringer interface {
    String() string
}

type Number struct {
    v int
}

func (number *Number) String() string {
    return strconv.Itoa(number.v)
}
Copier après la connexion

Cependant, l'erreur se produit dans la fonction principale, où un changement de type est tenté sur la variable n. , qui est de type *Number plutôt que Stringer.

func main() {
    n := &Number{1}
    switch v := n.(type) {
    case Stringer:
        fmt.Println("Stringer:", v)
    default:
        fmt.Println("Unknown")
    }
}
Copier après la connexion

Pour résoudre ce problème, vous devez convertir n en interface{} avant d'effectuer l'assertion de type. En effet, interface{} peut représenter n'importe quelle valeur arbitraire.

func main() {
    n := &Number{1}
    switch v := interface{}(n).(type) {
    case Stringer:
        fmt.Println("Stringer:", v)
    default:
        fmt.Println("Unknown")
    }
}
Copier après la connexion

En convertissant n en interface{}, vous autorisez essentiellement le commutateur de type à considérer la possibilité que n soit de type Stringer. Une fois le commutateur de type entré, le type réel de n peut être déterminé et la branche de cas appropriée exécutée.

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