Já existem boas respostas aqui. Deixe-me adicionar o meu também para outras pessoas que desejam entendê-lo intuitivamente:
Interface
Aqui está uma interface com um método:
type Runner interface {
Run()
}
Portanto, qualquer tipo que tenha um Run()método satisfaz a interface do Runner:
type Program struct {
/* fields */
}
func (p Program) Run() {
/* running */
}
func (p Program) Stop() {
/* stopping */
}
Embora o tipo de programa também tenha um método Stop, ele ainda satisfaz a interface do Runner, pois tudo o que é necessário é ter todos os métodos de uma interface para satisfazê-lo.
Portanto, ele possui um método Run e satisfaz a interface Runner.
Interface vazia
Aqui está uma interface vazia nomeada sem nenhum método:
type Empty interface {
/* it has no methods */
}
Portanto, qualquer tipo satisfaz essa interface. Porque, nenhum método é necessário para satisfazer essa interface. Por exemplo:
// Because, Empty interface has no methods, following types satisfy the Empty interface
var a Empty
a = 5
a = 6.5
a = "hello"
Mas, o tipo de programa acima o satisfaz? Sim:
a = Program{} // ok
interface {} é igual à interface vazia acima.
var b interface{}
// true: a == b
b = a
b = 9
b = "bye"
Como você vê, não há nada de misterioso nisso, mas é muito fácil abusar. Fique longe disso o máximo que puder.
https://play.golang.org/p/A-vwTddWJ7G
interface{}é mais ou menos o equivalentevoid *em C. Ele pode apontar para qualquer coisa e você precisa de uma asserção de tipo / conversão para usá-lo.