Maison > développement back-end > Golang > Pourquoi Go génère-t-il une erreur « Impossible de saisir le commutateur sur une valeur non-interface » ?

Pourquoi Go génère-t-il une erreur « Impossible de saisir le commutateur sur une valeur non-interface » ?

DDD
Libérer: 2024-11-17 11:37:02
original
946 Les gens l'ont consulté

Why Does Go Throw a

Assertion de type dans Go : résolution de « Impossible de saisir le commutateur sur une valeur non-interface »

Dans Go, l'assertion de type implique de vérifier si une valeur appartient à un type particulier. Lorsque vous rencontrez l'erreur « Impossible de saisir une valeur non-interface », cela signifie que la valeur vérifiée n'est pas une interface.

Considérez le code suivant :

type Stringer interface {
    String() string
}

type Number struct {
    v int
}

func (number *Number) String() string {
    return strconv.Itoa(number.v)
}

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

Ce code tente pour taper switch sur la valeur n, qui est de type *Number. Cependant, cela entraîne l'erreur « Impossible de taper sur une valeur non-interface ».

Pour résoudre ce problème, nous devons convertir n en une valeur d'interface avant d'effectuer l'assertion de type. En effet, la commutation de type ne peut être effectuée que sur les valeurs d'interface. Le code corrigé suivant le démontre :

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{}, nous permettons que le changement de type soit effectué sur la valeur d'interface résultante. Cela nous permet de vérifier avec succès si n est de type Stringer et d'imprimer le message correspondant.

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