¿Qué es una interface?
Una interface es una plantilla de métodos y es utilizado para proporcionar modularidad a Go. Es decir, la interface indica que métodos deben ser implementados pero no los define. Las interfaces son útiles ya que definen la especificación de los métodos, de forma que las posibles implementaciones pueden ser intercambiadas.
Las interfaces en Go son implícitas, es decir que un tipo/estructura implementa una interface cuando implementa todos los métodos y la firma de cada uno de ellos.
Tenemos 2 figuras, un Circulo y un Cuadrado, de ambos podemos calcular área y perímetro, nuestra interface contendrá ambos métodos.
type Figura interface {
Area() float64
Perimetro() float64
}
Ahora creamos cada una de las estructura del circulo que tiene un campo Radio.
type Circulo struct {
Radio float64
}
Para implementar la interface Figura
implementamos de forma implícita sus métodos Area() float64
y Perimetro() float64
.
func (c *Circulo) Area() float64 {
return 3.1416 * c.Radio * c.Radio
}
func (c *Circulo) Perimetro() float64 {
return 2 * 3.1416 * c.Radio
}
Creamos la estructura del cuadrado que tiene un campo Lado.
type Cuadrado struct {
Lado float64
}
Implementamos los métodos de la interface.
func (c *Cuadrado) Area() float64 {
return c.Lado * c.Lado
}
func (c *Cuadrado) Perimetro() float64 {
return 4 * c.Lado
}
La intención de la modularidad de la interface es que podamos utilizarla como argumento e invocar sus métodos independientemente de como estos se implementen. En este caso deseamos imprimir los detalles de cada Figura
que son Area
y Perimetro
.
func ImprimirDetalles(f Figura) {
fmt.Println("El área es: ", reflect.TypeOf(f).Elem().Name(), f.Area())
fmt.Println("El perímetro es: ", reflect.TypeOf(f).Elem().Name(), f.Perimetro())
}
Basta ahora enviar una instancia que implemente de forma implícita la interfaz figura. Creamos instancias para cada estructura y la enviamos como argumento a esta función que imprime los detalles.
figura1 := Circulo{Radio: 5.0}
figura2 := Cuadrado{Lado: 8.0}
ImprimirDetalles(&figura1)
ImprimirDetalles(&figura2)