Go Interfaces

Go Interfaces

¿Qué son las interfaces en Go?

En Go una Interface es un conjunto o colección de métodos que deberán ser implementados.

Por ejemplo, suponemos que deseas una interfaz para figuras geométricas IShape que defina un método de cálculo del área para todos los tipos de figuras

type IShape interface {
      area() float64
}

Ahora lo que haces es implementar esa interface que calcula el área para diferentes figuras.

Defines un struct Rectangle, Square y Triangle con sus campos:

// Create a Rectangle struct
type Rectangle struct {
      Lenght float64
      Width  float64
}

// Create a Square struct
type Square struct {
      SideLength float64
}

// Create a Triangle struct
type Triangle struct {
      Base   float64
      Height float64
}

Implementas el método de la interfaz para cada uno. Observa que la implementación de la interfaz está implícita. Si vienes de Java como es mi caso esto puede resultar confuso; en Java debes explícitamente indicar que tu clase implementa determinada interfaz.

El método tiene un receptor para Rectangle y el nombre del método es el de la interfaz, por lo que implícitamente estamos implementando para Rectangle el método de la interfaz. Lo mismo para el resto de figuras Square y Triangle.

// Implement IShape.area() for Rectangle
func (r Rectangle) area() float64 {
      return r.Lenght * r.Width
}

// Implement IShape.area() for Square
func (s Square) area() float64 {
      return s.SideLength * 2
}

// Implement IShape.area() for Triangle
func (t Triangle) area() float64 {
      return t.Base * t.Height / 2
}

Creas una función que reciba la interfaz y muestre y devuelva el resultado

func ShowArea(s IShape) string {
      return fmt.Sprintf("Area %f", s.area())
}

Tu código completo para este ejemplo luce así:

package main

import (
      "fmt"
)


// Interface
type IShape interface {
      area() float64
}

// Create a Rectangle struct
type Rectangle struct {
      Lenght float64
      Width  float64
}

// Create a Square struct
type Square struct {
      SideLength float64
}

// Create a Triangle struct
type Triangle struct {
      Base   float64
      Height float64
}

// Implement IShape.area() for Rectangle
func (r Rectangle) area() float64 {
      return r.Lenght * r.Width
}

// Implement IShape.area() for Square
func (s Square) area() float64 {
      return s.SideLength * 2
}

// Implement IShape.area() for Triangle
func (t Triangle) area() float64 {
      return t.Base * t.Height / 2
}

// Function to show Area
func ShowArea(s IShape) string {
      return fmt.Sprintf("Area %f", s.area())
}

func main() {
      // creating a Rectangle
      fmt.Println("Rectangle", ShowArea(Rectangle{10, 50}))
      fmt.Println("Square", ShowArea(Square{40}))
      fmt.Println("Triangle", ShowArea(Triangle{20,30}))
}

Ejecutando tu código:

$ go run interfaces.go
Rectangle Area 500.000000
Square Area 80.000000
Triangle Area 300.000000

go  golang