Ich bin neu in Schnittstellen und versuche, SOAP-Anfragen von Github zu machen
Ich verstehe die Bedeutung von nicht
Msg interface{}
in diesem Code:
type Envelope struct {
Body `xml:"soap:"`
}
type Body struct {
Msg interface{}
}
Ich habe die gleiche Syntax in beobachtet
fmt.Println
aber verstehe nicht, was durch erreicht wird
interface{}
interface{}
ist mehr oder weniger das Äquivalent vonvoid *
in C. Es kann auf alles verweisen und Sie benötigen eine Cast / Type-Zusicherung, um es zu verwenden.Antworten:
Sie können auf den Artikel " Verwendung von Schnittstellen in Go " verweisen (basierend auf " Russ Cox 'Beschreibung der Schnittstellen "):
(Das ist, was
Msg
in Ihrer Frage darstellt: jeder Wert)Nachtrag: Hier ist Russ 'Artikel bezüglich einer Schnittstellenstruktur ziemlich vollständig:
quelle
interface{}
bedeutet, dass Sie einen beliebigen Wert eingeben können, einschließlich Ihres eigenen benutzerdefinierten Typs. Alle Typen in Go erfüllen eine leere Schnittstelle (interface{}
ist eine leere Schnittstelle).In Ihrem Beispiel kann das Msg-Feld einen beliebigen Wert haben.
Beispiel:
Geh zum Spielplatz
quelle
Es wird als leere Schnittstelle bezeichnet und von allen Typen implementiert, was bedeutet, dass Sie alles in das
Msg
Feld einfügen können .Beispiel:
Dies ist die logische Erweiterung der Tatsache, dass ein Typ eine Schnittstelle implementiert, sobald er über alle Methoden der Schnittstelle verfügt.
quelle
Hier gibt es bereits gute Antworten. Lassen Sie mich auch meine eigenen für andere hinzufügen, die es intuitiv verstehen wollen:
Schnittstelle
Hier ist eine Schnittstelle mit einer Methode:
Jeder Typ mit einer
Run()
Methode erfüllt also die Runner-Schnittstelle:Obwohl der Programmtyp auch über eine Stop-Methode verfügt, erfüllt er die Runner-Schnittstelle weiterhin, da lediglich alle Methoden einer Schnittstelle erforderlich sind, um diese zu erfüllen.
Es hat also eine Run-Methode und erfüllt die Runner-Schnittstelle.
Leere Schnittstelle
Hier ist eine benannte leere Schnittstelle ohne Methoden:
Jeder Typ erfüllt also diese Schnittstelle. Da keine Methode erforderlich ist, um diese Schnittstelle zu erfüllen. Beispielsweise:
Aber erfüllt der oben genannte Programmtyp dies? Ja:
Schnittstelle {} entspricht der obigen leeren Schnittstelle.
Wie Sie sehen, ist daran nichts Geheimnisvolles, aber es ist sehr leicht zu missbrauchen. Halte dich so weit wie möglich davon fern.
https://play.golang.org/p/A-vwTddWJ7G
quelle
type Runner interface
wird im Go-Spielplatzbeispiel nicht verwendet.Aus den Golang-Spezifikationen :
Die Konzepte für Graps sind:
T
hat drei Methoden:A
,B
,C
.T_interface = (A, B, C)
MyInterface = (A, )
MyInterface
müssenT_interface
Sie können daraus schließen, dass alle "Schnittstellentypen" aller Typen eine Obermenge der leeren Schnittstelle sind.
quelle
Ein Beispiel, das die hervorragende Antwort von @VonC und den Kommentar von @ NickCraig-Wood erweitert.
interface{}
kann auf alles verweisen und Sie benötigen eine Cast / Type-Zusicherung, um es zu verwenden.i
ist eine Variable einer leeren Schnittstelle mit einem Wertcat("Fish")
. Es ist zulässig, einen Methodenwert aus einem Wert vom Schnittstellentyp zu erstellen. Siehe https://golang.org/ref/spec#Interface_types .Ein Typschalter bestätigt, dass der
i
Schnittstellentyp istcat("Fish")
. Siehe https://golang.org/doc/effective_go.html#type_switch .i
wird dann neu zugewiesendog("Bone")
. Ein Typschalter bestätigt, dass sich deri
Schnittstellentyp in geändert hatdog("Bone")
.Sie können den Compiler auch bitten, zu überprüfen, ob der Typ
T
die Schnittstelle implementiert,I
indem Sie versuchen, eine Zuweisung vorzunehmen :var _ I = T{}
. Siehe https://golang.org/doc/faq#guarantee_satisfies_interface und https://stackoverflow.com/a/60663003/12817546 .Alle Typen implementieren die leere Schnittstelle
interface{}
. Siehe https://talks.golang.org/2012/goforc.slide#44 und https://golang.org/ref/spec#Interface_types . In diesem Beispieli
wird diesmal eine Zeichenfolge "4.3" neu zugewiesen.i
wird dann zu einem neuen String - Variable zugeordnets
miti.(string)
bevors
zu einem float64 Typ umgewandelt wirdf
verwendetstrconv
. Schließlichf
wird inn
einen int-Typ gleich 4 konvertiert. Siehe Was ist der Unterschied zwischen Typkonvertierung und Typzusicherung?Dank der integrierten Karten und Slices von Go und der Möglichkeit, die leere Schnittstelle zum Erstellen von Containern (mit explizitem Unboxing) zu verwenden, ist es in vielen Fällen möglich, Code zu schreiben, der das tut, was Generika ermöglichen würden, wenn auch weniger reibungslos. Siehe https://golang.org/doc/faq#generics .
quelle