Una interfaz no es más que un método en el cual puedas compartir diferentes otros métodos, es decir, imaginemos que tenemos un mismo método, pero ese mismo método aplica a varios structs, entonces la forma de crear un solo punto de entrada es mediante una interfaz.
Para entender la interfaz, vamos a poner a manera de ejemplo, el cálculo de las áreas de un cuadrado y un rectángulo. Cada uno de estos tiene un struct y una función asociada al struct correspondiente en donde se hace el cálculo de las áreas. Para acceder a estas funciones lo haremos através de una interfaz que contiene ambas funciones el cuál recibe un struct, dependiendo del struct, éste accede a una función o a otra.
package main
import "fmt"
type figuras2D interface {
area() float64
}
type cuadrado struct {
base float64
}
type rectangulo struct {
base float64
altura float64
}
func (c cuadrado) area() float64 {
return c.base * c.base
}
func (r rectangulo) area() float64 {
return r.base * r.altura
}
func calcular(f figuras2D) {
fmt.Println("Áreas:", f.area())
}
func main(){
myCuadrado := cuadrado{base: 2}
myRectangulo := rectangulo{base: 2, altura: 4}
calcular(myCuadrado)
calcular(myRectangulo)
}
Resultado:
Áreas: 4
Áreas: 8
En muchos lenguajes de programación más flexibles, a una misma lista se le puede agregar diferentes tipos de datos, por ejemplo [1, "hola", true]
. En Go no es posible hacer esto, ya que al crear una lista se le debe indicar el tipo de dato que vamos a insertar en la lista.
Para simular esto en Go vamos a necesitas de la Lista de interfaces, y se hace de la siguiente manera:
package main
import "fmt"
func main(){
// Lista interfaces
myInterface := []interface{}{"Hola", 12, true}
fmt.Println(myInterface...)
}
Resultado:
Hola 12 true
Reto
Realizar el mismo ejercicio de cálculo de áreas pero con paquetes.