🥇 Interfaces.

Una interface es una plantilla de métodos y es utilizado para prorpocionar 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 implicitas, es decir que un tipo/estructura implementa una interface cuando implementa todos los metodos 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)
Métodos. Strings.
comments powered by Disqus