Ich arbeite gerade an der Go-Tour und bin verwirrt über Zeiger und Schnittstellen. Warum wird dieser Go-Code nicht kompiliert?
package main
type Interface interface {}
type Struct struct {}
func main() {
var ps *Struct
var pi *Interface
pi = ps
_, _ = pi, ps
}
dh wenn Struct
ist ein Interface
, warum sollte ein nicht ein *Struct
sein *Interface
?
Die Fehlermeldung, die ich erhalte, lautet:
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 }
und Ihre eigenen Schlussfolgerungen zu ziehenAntworten:
Wenn eine Struktur eine Schnittstelle implementiert, implementiert ein Zeiger auf diese Struktur automatisch auch diese Schnittstelle. Aus diesem Grund haben Sie nie einen
*SomeInterface
Prototyp von Funktionen, da dies nichts hinzufügen würdeSomeInterface
, und Sie benötigen keinen solchen Typ in der Variablendeklaration (siehe diese verwandte Frage ).Ein Schnittstellenwert ist nicht der Wert der konkreten Struktur (da er eine variable Größe hat, wäre dies nicht möglich), sondern eine Art Zeiger (genauer gesagt ein Zeiger auf die Struktur und ein Zeiger auf den Typ ). Russ Cox beschreibt es genau hier :
Dies ist der Grund
Interface
und nicht*Interface
der richtige Typ, um einen Zeiger auf eine implementierte Struktur zu haltenInterface
.Sie müssen also einfach verwenden
quelle
var pi *Interface
.*SomeInterface
es nicht einfach ein Kompilierungsfehler ist.Das haben Sie vielleicht gemeint:
Kompiliert OK. Siehe auch hier .
quelle
Hier ist eine sehr einfache Möglichkeit, einer Schnittstelle eine Struktur zuzuweisen:
https://play.golang.org/p/BRTaTA5AG0S
quelle
Ich verwende die folgende Methode,
interface{}
während ich nureventsI interface{}
als Argumente konsumiere , aber ich bin immer noch in der Lage, Strukturzeiger zu senden, wie Sie unten sehen können.main.go
Jetzt in der
storyboard.go
Datei Create-FunktionWie Sie oben sehen können, verbraucht das Storyboard.go nur,
Events []interface{}
aber tatsächlich ist das Senden ein Strukturzeiger und es funktioniert gut.ein weiteres Beispiel hier
quelle