Ya hay buenas respuestas aquí. Permítanme agregar el mío también para otros que quieran entenderlo intuitivamente:
Interfaz
Aquí hay una interfaz con un método:
type Runner interface {
Run()
}
Entonces, cualquier tipo que tenga un Run()
método satisface la interfaz Runner:
type Program struct {
/* fields */
}
func (p Program) Run() {
/* running */
}
func (p Program) Stop() {
/* stopping */
}
Aunque el tipo de programa también tiene un método Stop, todavía satisface la interfaz Runner porque todo lo que se necesita es tener todos los métodos de una interfaz para satisfacerla.
Por lo tanto, tiene un método Run y satisface la interfaz Runner.
Interfaz vacía
Aquí hay una interfaz vacía con nombre sin ningún método:
type Empty interface {
/* it has no methods */
}
Entonces, cualquier tipo satisface esta interfaz. Porque no se necesita ningún método para satisfacer esta interfaz. Por ejemplo:
// Because, Empty interface has no methods, following types satisfy the Empty interface
var a Empty
a = 5
a = 6.5
a = "hello"
Pero, ¿el tipo de programa anterior lo satisface? Si:
a = Program{} // ok
interfaz {} es igual a la interfaz vacía anterior.
var b interface{}
// true: a == b
b = a
b = 9
b = "bye"
Como puede ver, no tiene nada de misterioso, pero es muy fácil abusar de él. Manténgase alejado de él tanto como pueda.
https://play.golang.org/p/A-vwTddWJ7G
interface{}
es más o menos el equivalente devoid *
en C. Puede apuntar a cualquier cosa y necesita una aserción de conversión / tipo para usarlo.