Je suis nouveau dans les interfaces et j'essaie de faire une requête SOAP par github
Je ne comprends pas la signification de
Msg interface{}
dans ce code:
type Envelope struct {
Body `xml:"soap:"`
}
type Body struct {
Msg interface{}
}
J'ai observé la même syntaxe dans
fmt.Println
mais ne comprends pas ce qui est réalisé par
interface{}
interface{}
est plus ou moins l'équivalent devoid *
in C. Il peut pointer vers n'importe quoi et vous avez besoin d'une assertion cast / type pour l'utiliser.Réponses:
Vous pouvez vous référer à l'article " Comment utiliser les interfaces dans Go " (basé sur la " description des interfaces de Russ Cox "):
(C'est ce que
Msg
représente dans votre question: toute valeur)Addendum: Voici où l'article de Russ est assez complet concernant une structure d'interface:
la source
interface{}
signifie que vous pouvez mettre une valeur de n'importe quel type, y compris votre propre type personnalisé. Tous les types de Go satisfont une interface vide (interface{}
c'est une interface vide).Dans votre exemple, le champ Msg peut avoir une valeur de n'importe quel type.
Exemple:
Aller au terrain de jeu
la source
Elle s'appelle l' interface vide et est implémentée par tous les types, ce qui signifie que vous pouvez tout mettre dans le
Msg
champ.Exemple :
C'est l'extension logique du fait qu'un type implémente une interface dès qu'il a toutes les méthodes de l'interface.
la source
Il y a déjà de bonnes réponses ici. Permettez-moi d'ajouter le mien aussi pour ceux qui veulent le comprendre intuitivement:
Interface
Voici une interface avec une méthode:
Donc, tout type qui a une
Run()
méthode satisfait l'interface Runner:Bien que le type Program ait également une méthode Stop, il satisfait toujours l'interface Runner car il suffit d'avoir toutes les méthodes d'une interface pour la satisfaire.
Donc, il a une méthode Run et il satisfait l'interface Runner.
Interface vide
Voici une interface vide nommée sans aucune méthode:
Donc, tout type satisfait cette interface. Parce qu'aucune méthode n'est nécessaire pour satisfaire cette interface. Par exemple:
Mais, le type de programme ci-dessus le satisfait-il? Oui:
interface {} est égal à l'interface vide ci-dessus.
Comme vous le voyez, cela n'a rien de mystérieux, mais il est très facile d'en abuser. Éloignez-vous autant que vous le pouvez.
https://play.golang.org/p/A-vwTddWJ7G
la source
type Runner interface
n'est pas utilisé dans l'exemple de terrain de jeu Go.D'après les spécifications de Golang :
Les concepts aux graps sont:
T
a 3 méthodes:A
,B
,C
.T_interface = (A, B, C)
MyInterface = (A, )
MyInterface
doivent être contenues à l'intérieurT_interface
Vous pouvez en déduire que tous les "types d'interface" de tous les types sont un sur-ensemble de l'interface vide.
la source
Un exemple qui prolonge l'excellente réponse de @VonC et le commentaire de @ NickCraig-Wood.
interface{}
peut pointer vers n'importe quoi et vous avez besoin d'une assertion de cast / type pour l'utiliser.i
est une variable d'une interface vide avec une valeurcat("Fish")
. Il est légal de créer une valeur de méthode à partir d'une valeur de type d'interface. Voir https://golang.org/ref/spec#Interface_types .Un commutateur de type confirme que le
i
type d'interface estcat("Fish")
. Voir https://golang.org/doc/effective_go.html#type_switch .i
est ensuite réaffecté àdog("Bone")
. Un commutateur de type confirme quei
le type d'interface est devenudog("Bone")
.Vous pouvez également demander au compilateur de vérifier que le type
T
implémente l'interfaceI
en essayant une mission:var _ I = T{}
. Voir https://golang.org/doc/faq#guarantee_satisfies_interface et https://stackoverflow.com/a/60663003/12817546 .Tous les types implémentent l'interface vide
interface{}
. Voir https://talks.golang.org/2012/goforc.slide#44 et https://golang.org/ref/spec#Interface_types . Dans cet exemple,i
est réaffecté, cette fois à une chaîne "4.3".i
est ensuite assigné à une nouvelle variable de chaînes
aveci.(string)
befores
est converti en un type float64 enf
utilisantstrconv
. Enfinf
est converti enn
un type int égal à 4. Voir Quelle est la différence entre la conversion de type et l'assertion de type?Les cartes et les tranches intégrées de Go, ainsi que la possibilité d'utiliser l'interface vide pour construire des conteneurs (avec unboxing explicite) signifient que dans de nombreux cas, il est possible d'écrire du code qui fait ce que les génériques permettraient, bien que moins facilement. Voir https://golang.org/doc/faq#generics .
la source