web-dev-qa-db-fra.com

Impossible de taper le commutateur sur la valeur non-interface

Je joue avec l'assertion de type en utilisant le code factice suivant, et j'ai eu l'erreur:

impossible de taper switch on non-interface value

Est-ce que quelqu'un sait ce que cela signifie?

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

http://play.golang.org/p/Ti4FG0m1mc

21
Mingyu

Les commutateurs de type nécessitent une interface pour introspecter. Si vous lui passez une valeur de type connu, elle bombarde. Si vous créez une fonction qui accepte une interface en tant que paramètre, cela fonctionnera:

func typeSwitch(tst interface{}) {
    switch v := tst.(type) {
        case Stringer:
           fmt.Println("Stringer:", v)
        default:
           fmt.Println("Unknown")
    }
}

Voir le code complet ici http://play.golang.org/p/QNyf0eG71_ et la documentation de golang sur les interfaces http://golang.org/doc/effective_go.html#interfaces .

25
dethtron5000

J'ai trouvé la réponse, qui consiste à lancer n à interface{} avant l'assertion de type:

switch v := interface{}(n).(type)
38
Mingyu

Il existe deux types de conversions de types

  1. conversion entre les types de données de base. Pour cela, nous pouvons utiliser la coulée directe

    i: = 48

    str: = chaîne (i)

  2. Mais la conversion de type en utilisant value. (Type) sert à la conversion entre la hiérarchie des classes (par exemple, où nous voulons obtenir l'implémentation spécifique de l'interface). Sinon, nous obtenons l'erreur ci-dessus.

2
pr-pal

Il n'y a pas de typographie dans Go. Vous effectuez une conversion de type.

0
Volker