Desarrollo

Interfaces en Go

Publicado el
Etiquetas: go101 go interfaces
Interfaces en Go
Comparte

En este artículo, exploraremos el concepto de interfaces en el lenguaje de programación Go (Golang) y cómo se utilizan para definir un conjunto de métodos que los tipos pueden implementar. Además, veremos cómo trabajar con interfaces, implementarlas en tipos concretos y manejar situaciones especiales, como las interfaces vacías y la confirmación de tipos.

Definición de Interfaces

Una interface en Go se define como un conjunto de firmas de métodos. Para crear una interfaz, se utiliza la palabra clave type seguida de interface, y entre corchetes se especifican las firmas de los métodos. A continuación, se presenta un ejemplo de una interfaz llamada Geometry que incluye métodos para calcular el perímetro y el área de figuras:

type Geometry interface {
  Perimeter() int
  Area() int
}

En Go, a diferencia de otros lenguajes, no existen palabras clave específicas para implementar interfaces. Cualquier tipo que implemente todos los métodos de una interfaz se considera automáticamente una implementación válida.

Implementación de una Interfaz

A continuación, mostraremos cómo implementar la interfaz Geometry en un tipo llamado Square:

type Square struct {
  a int
}

func (s Square) Perimeter() int {
  return s.a * 4
}

func (s Square) Area() int {
  return s.a * s.a
}

En este ejemplo, el tipo Square implementa los métodos requeridos por la interfaz Geometry, lo que significa que se considera una implementación válida de dicha interfaz.

Utilización de Interfaces

Puede pasar cualquier tipo que implemente una interfaz como argumento a una función que espera una interfaz. Aquí hay un ejemplo de una función llamada Details que muestra detalles sobre el perímetro y el área de una figura:

func Details(g Geometry) {
  fmt.Println("Perimeter: ", g.Perimeter())
  fmt.Println("Area: ", g.Area())
}

Dentro de la función main(), puede crear un objeto Square y pasar ese objeto a la función Details para obtener los detalles deseados:

func main() {
  s := Square{5}
  Details(s)
}

Este enfoque permite una flexibilidad significativa al trabajar con diferentes tipos que cumplen con la misma interfaz.

Interfaces Vacías y Type Assertion

Las interfaces vacías en Go son interfaces que no contienen métodos. Esto significa que cualquier tipo se considera automáticamente una implementación de una interfaz vacía, ya que no hay métodos que cumplir. Esto es especialmente útil al trabajar con funciones que aceptan diferentes tipos de valores, como la función Print() del paquete fmt.

Para determinar el tipo subyacente de una variable interfaz, se puede utilizar la técnica de type assertion. Esto se hace de la siguiente manera:

var g Geometry = Square{5}
v, ok := g.(Square)

El valor de v se llenará con el valor del tipo subyacente si la confirmación tiene éxito, y ok será true. En caso contrario, v se llenará con un valor por defecto y ok será false. Es importante no omitir ok, ya que podría resultar en un error si la confirmación falla.

Type Switch

En Go, se puede utilizar un type switch para determinar el tipo subyacente de una variable interfaz. En este tipo de switch, los enunciados case especifican los tipos y no los valores. Aquí hay un ejemplo de cómo usarlo:

switch g.(type) {
  case Square:
    fmt.Printf("Es un Square")
  case Rectangle:
    fmt.Printf("Es un Rectangle")
  default:
    fmt.Printf("Tipo desconocido")  
}

Este enfoque es útil cuando se necesita tomar decisiones basadas en el tipo subyacente de una variable interfaz.

Conclusión

En este artículo, hemos explorado las interfaces en Go y cómo se utilizan para definir un conjunto de métodos que los tipos pueden implementar. Hemos visto ejemplos de implementación de interfaces, cómo trabajar con interfaces vacías y cómo realizar type assertion y type switch para trabajar con variables interfaz de manera efectiva. Las interfaces son una parte fundamental de Go y permiten escribir código más flexible y reutilizable.

Javier Sanchez Toledano
Escrito por Javier Sanchez Toledano Sígueme

Soy Licenciado en Informática e Ingeniero en Sistemas Computacionales.
Soy auditor líder certificado por ICA en la Norma ISO 9000, desarrollo sistemas de gestión de la calidad con un enfoque de mejora continua, creo tableros de control con indicadores clave para mejorar la toma de decisiones basadas en datos.

Comentarios