Maison  >  Article  >  développement back-end  >  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
DDDoriginal
2024-11-17 11:37:02870parcourir

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")
    }
}

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")
}

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!

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