En Go, los métodos son funciones con un receiver (receptor) que indica a qué tipo pertenece el método:
type User struct { Name string } func (u *User) SayHello() { fmt.Println("Hola,", u.Name) }
(u *User)) actúa como el primer argumento en la función, pero la sintaxis y las llamadas son diferentes.¡Importante! Solo se pueden declarar métodos para tipos definidos en tu paquete (no se permiten métodos en tipos definidos en otros paquetes, incluidos tipos incorporados). El comportamiento con alias (type alias) es especial:
type MyInt int) — se pueden agregar métodos.type MyInt = int) — no se pueden agregar métodos, porque es solo un alias.Ejemplo:
type MyInt int func (m MyInt) Double() int { return int(m) * 2 } // Type alias type MyIntAlias = int // func (m MyIntAlias) Double() int { ... } // error de compilación
¿Se puede declarar un método para un slice del tipo []int o para un type alias?
Respuesta: No se pueden declarar métodos para el tipo incorporado ([]int). Para un nuevo tipo de usuario basado en un slice — se puede:
type MySlice []int func (s MySlice) Sum() int { ... } // permitido
Para type alias no se puede:
type SuperSlice = []int // func (s SuperSlice) Sum() int { ... } // error
Historia
Historia
Historia
Al intentar agregar métodos a tipos de un paquete externo (por ejemplo, time.Time) para estandarizar el trabajo con fechas se descubrió que esto no era posible en Go — se tuvo que usar composición y funciones utilitarias.