Je travaille juste sur la tournée Go , et je suis confus au sujet des pointeurs et des interfaces. Pourquoi ce code Go ne se compile-t-il pas?
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 un Interface
, pourquoi ne serait-il pas *Struct
un *Interface
?
Le message d'erreur que je reçois est:
prog.go:10: cannot use ps (type *Struct) as type *Interface in assignment:
*Interface is pointer to interface, not interface
func main() { var ps *Struct = new(Struct) var pi *Interface var i Interface i = ps pi = &i fmt.Printf("%v, %v, %v\n", *ps, pi, &i) i = *ps fmt.Printf("%v, %v, %v\n", *ps, pi, i) _, _, _ = i, pi, ps }
et de faire vos propres conclusionsRéponses:
Lorsque vous avez une structure implémentant une interface, un pointeur vers cette structure implémente également automatiquement cette interface. C'est pourquoi vous n'avez jamais
*SomeInterface
dans le prototype de fonctions, car cela n'ajouterait rienSomeInterface
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, ce ne serait pas possible), mais c'est une sorte de pointeur (pour être plus précis un pointeur vers la structure et un pointeur vers le type ). Russ Cox le décrit exactement ici :
C'est pourquoi
Interface
, et non,*Interface
le type approprié pour contenir un pointeur vers une struct implémentationInterface
.Vous devez donc simplement utiliser
la source
var pi *Interface
.*SomeInterface
n'est pas simplement une erreur de compilation?C'est peut-être ce que vous vouliez dire:
Compile OK. Voir aussi ici .
la source
Voici un moyen très simple d'attribuer une structure à une interface:
https://play.golang.org/p/BRTaTA5AG0S
la source
J'utilise la manière suivante de
interface{}
tout en consommant justeeventsI interface{}
comme arguments, je suis toujours capable d'envoyer des pointeurs de structure comme vous pouvez le voir ci-dessous.main.go
Maintenant dans
storyboard.go
la fonction de création de fichierComme vous pouvez le voir ci-dessus, le Storyboard.go consomme juste,
Events []interface{}
mais en fait, l'envoi d'Im est un pointeur Struct et cela fonctionne bien.un autre exemple ici
la source