En Go, las interfaces son tipos que definen un conjunto de métodos. Permiten definir un comportamiento común que diferentes tipos pueden implementar, lo que proporciona una forma flexible y poderosa de hacer programación orientada a objetos sin herencia.
Una interface en Go es un tipo que especifica un conjunto de métodos que otros tipos deben implementar. No define cómo los métodos deben ser implementados, solo define qué métodos deben estar presentes. Esto permite que diferentes tipos compartan un comportamiento común, lo que facilita el polimorfismo.
Una interfaz en Go se define utilizando la palabra clave interface
. Aquí tienes un ejemplo básico de cómo declarar una interfaz:
package main
import "fmt"
// Definir la interfaz
type Animal interface {
Hablar() string
}
// Definir un tipo que implemente la interfaz
type Perro struct{}
func (p Perro) Hablar() string {
return "Guau"
}
type Gato struct{}
func (g Gato) Hablar() string {
return "Miau"
}
func main() {
var animal Animal
animal = Perro{}
fmt.Println(animal.Hablar()) // Output: Guau
animal = Gato{}
fmt.Println(animal.Hablar()) // Output: Miau
}
En este ejemplo, la interfaz Animal
declara un método Hablar
. Luego, los tipos Perro
y Gato
implementan este método, y gracias a la interfaz Animal
, ambos pueden ser tratados de manera similar, a pesar de ser tipos diferentes.
1. Polimorfismo: Permite que diferentes tipos se comporten de manera similar si implementan los mismos métodos.
2. Flexibilidad: Se pueden agregar comportamientos comunes a varios tipos sin necesidad de herencia.
3. Desacoplamiento: Facilita la creación de código más modular, al no depender de implementaciones concretas.
Las interfaces en Go pueden definir más de un método. Aquí tienes un ejemplo donde una interfaz define dos métodos:
package main
import "fmt"
// Definir la interfaz con múltiples métodos
type Forma interface {
Area() float64
Perimetro() float64
}
// Definir un tipo que implemente la interfaz
type Cuadrado struct {
Lado float64
}
func (c Cuadrado) Area() float64 {
return c.Lado * c.Lado
}
func (c Cuadrado) Perimetro() float64 {
return 4 * c.Lado
}
func main() {
var forma Forma
forma = Cuadrado{Lado: 5}
fmt.Println("Área:", forma.Area()) // Output: Área: 25
fmt.Println("Perímetro:", forma.Perimetro()) // Output: Perímetro: 20
}
En este caso, la interfaz Forma
declara dos métodos: Area
y Perimetro
. El tipo Cuadrado
implementa ambos métodos, permitiendo así que los objetos de tipo Cuadrado
puedan ser tratados como de tipo Forma
.
Go también permite definir interfaces vacías, que no requieren la implementación de ningún método. Esto se conoce como interface{}
y es útil cuando no se sabe el tipo exacto de una variable en tiempo de compilación, ya que cualquier tipo satisface esta interfaz:
package main
import "fmt"
func imprimirValor(valor interface{}) {
fmt.Println(valor)
}
func main() {
imprimirValor(42)
imprimirValor("Hola, mundo")
imprimirValor(3.14)
}
En este ejemplo, la función imprimirValor
acepta un valor de tipo interface{}
, lo que significa que puede recibir cualquier tipo de dato.
Para más información sobre interfaces en Go, consulta la documentación oficial de Go.
Jorge García
Fullstack developer