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")
}
}
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 .
J'ai trouvé la réponse, qui consiste à lancer n
à interface{}
avant l'assertion de type:
switch v := interface{}(n).(type)
Il existe deux types de conversions de types
conversion entre les types de données de base. Pour cela, nous pouvons utiliser la coulée directe
i: = 48
str: = chaîne (i)
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.
Il n'y a pas de typographie dans Go. Vous effectuez une conversion de type.