Maison >développement back-end >Golang >Assertion de type dans Go : pourquoi « Impossible de saisir le commutateur sur une valeur non-interface » et comment y remédier ?

Assertion de type dans Go : pourquoi « Impossible de saisir le commutateur sur une valeur non-interface » et comment y remédier ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-13 10:56:02468parcourir

Type Assertion in Go: Why

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

Lorsque vous travaillez avec des assertions de type dans Go, il est possible de rencontrer l'erreur "Impossible de taper sur une valeur non-interface". Voyons ce que cela signifie et comment le résoudre, avec un exemple utilisant un type personnalisé.

Considérez l'extrait de code suivant :

package main

import "fmt"
import "strconv"

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

Lorsque vous exécutez ce code, vous rencontrez l’erreur « Impossible de taper sur une valeur non-interface ». Cela indique que l'assertion de type est effectuée sur une valeur non-interface. Dans ce cas, n est un pointeur vers une structure Number, qui n'est pas une interface.

La solution consiste à convertir la valeur en une interface{} avant de tenter l'assertion de type. En effet, les assertions de type ne peuvent être effectuées que sur les valeurs d'interface. Voici le code corrigé :

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

Maintenant, lorsque vous exécutez le code, il affichera "Stringer : 1". En effet, la conversion de n en interface{} lui permet d'être traité comme une valeur d'interface pour l'assertion de type.

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