Pourquoi ne puis-je pas atsortingbuer une structure * à une interface *?

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.

entrer la description de l'image ici

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 .