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.

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

Lista de interfaces

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.

Lecturas recomendadas