En la mayoría de los lenguajes orientados a objetos hay una clase base predefinida, a menudo llamada object, que actúa como superclase de todas las clases. Esto es lo que ocurre con una interfaz vacía sin métodos: interface{} en go. Puesto que las interfaces se implementan implícitamente, todos los tipos encajan con el contrato de una interfaz vacía.
Si quisiéramos podríamos crear una función llamada add con la siguiente firma:
func add(a interface{}, b interface{}) interface{} {
...
}
Por lo que podriamos utilizar esta función con cualquier tipo. Pero si nosotros necesitamos hacer diferentes acciones por tipo podemos convertir los tipos.
Para convertir una variable a un tipo específico debes usar .(TIPO):
return a.(int) + b.(int)
También puedes crear switchs de tipos:
switch a.(type) {
case int:
fmt.Printf("a es un entero y vale %d\n", a)
case bool, string:
// ...
default:
// ...
}
Sé que no es una solución elegante pero muchas veces viene bien.