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:
type Runner interface {
Run()
}
Donc, tout type qui a une Run()
méthode satisfait l'interface Runner:
type Program struct {
/* fields */
}
func (p Program) Run() {
/* running */
}
func (p Program) Stop() {
/* stopping */
}
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:
type Empty interface {
/* it has no methods */
}
Donc, tout type satisfait cette interface. Parce qu'aucune méthode n'est nécessaire pour satisfaire cette interface. Par exemple:
// Because, Empty interface has no methods, following types satisfy the Empty interface
var a Empty
a = 5
a = 6.5
a = "hello"
Mais, le type de programme ci-dessus le satisfait-il? Oui:
a = Program{} // ok
interface {} est égal à l'interface vide ci-dessus.
var b interface{}
// true: a == b
b = a
b = 9
b = "bye"
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
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.