Je travaille juste à travers le Go tour , et je suis confus au sujet des pointeurs et des interfaces. Pourquoi ce code Go n'est-il pas compilé?
package main
type Interface interface {}
type Struct struct {}
func main() {
var ps *Struct
var pi *Interface
pi = ps
_, _ = pi, ps
}
c'est-à-dire si Struct
est une Interface
, pourquoi un *Struct
ne serait-il pas un *Interface
?
Le message d'erreur que je reçois est le suivant:
prog.go:10: cannot use ps (type *Struct) as type *Interface in assignment:
*Interface is pointer to interface, not interface
Lorsque vous avez une structure implémentant une interface, un pointeur sur cette structure implémente automatiquement cette interface également. C'est pourquoi vous n'avez jamais *SomeInterface
dans le prototype de fonctions, car cela n'ajoute rien à SomeInterface
et vous n'avez pas besoin d'un tel type dans la déclaration de variable (voir cette question connexe ).
Une valeur d'interface n'est pas la valeur de la structure concrète (car elle a une taille variable, cela ne serait pas possible), mais c'est une sorte de pointeur (pour être plus précis, un pointeur sur la structure et un type ). Russ Cox le décrit exactement ici :
Les valeurs d'interface sont représentées sous la forme d'une paire de deux mots donnant un pointeur des informations sur le type stocké dans l'interface et un pointeur sur les données associées.
C'est pourquoi Interface
, et non *Interface
est le type correct pour contenir un pointeur sur une structure implémentant Interface
.
Donc, vous devez simplement utiliser
var pi Interface
C'est peut-être ce que vous vouliez dire:
package main
type Interface interface{}
type Struct struct{}
func main() {
var ps *Struct
var pi *Interface
pi = new(Interface)
*pi = ps
_, _ = pi, ps
}
Compile bien. Voir aussi ici .
Voici un moyen très simple d'affecter une structure à une interface:
package main
type Interface interface{}
type Struct struct{}
func main() {
ps := new(Struct)
pi := Interface(ps)
_, _ = pi, ps
}