Je travaille juste sur la tournée Go , et je suis confus au sujet des pointeurs et des interfaces. Pourquoi ce code Go ne comstack-t-il pas?
package main type Interface interface {} type Struct struct {} func main() { var ps *Struct var pi *Interface pi = ps _, _ = pi, ps }
Par exemple, si Struct
est une Interface
, pourquoi une *Struct
ne serait-elle pas une *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 vers cette structure implémente automatiquement cette interface. C’est pourquoi vous n’avez jamais *SomeInterface
dans le prototype des fonctions, car cela n’appendait rien à SomeInterface
, et vous n’avez pas besoin d’un tel type de 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, ce ne serait pas possible), mais c’est une sorte de pointeur (pour être plus précis, un pointeur sur la structure et un pointeur sur le type ). Russ Cox le décrit exactement ici :
Les valeurs d’interface sont représentées par une paire de deux mots donnant un pointeur vers des informations sur le type stocké dans l’interface et un pointeur sur les données associées.
C’est pourquoi Interface
, et non pas *Interface
est le type correct pour placer un pointeur sur une structure implémentant l’ 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 }
Comstack OK. Voir aussi ici .