Definición de métodos en structs
Parte de la sección Programación Orientada a Objetos del Journey de GO de Coddy — lección 7 de 107.
Los métodos en Go son funciones con un argumento receptor especial que asocia la función con un tipo struct.
Sintaxis del método
func (receiverName StructType) MethodName() ReturnType {
// cuerpo del método
}Define una estructura con métodos
type Rectangle struct {
Width float64
Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func (r Rectangle) Perimeter() float64 {
return 2 * (r.Width + r.Height)
}Métodos con parámetros
func (r Rectangle) Scale(factor float64) float64 {
return r.Area() * factor
}Llamada a métodos
rect := Rectangle{Width: 5, Height: 3}
fmt.Println(rect.Area()) // Output: 15
fmt.Println(rect.Perimeter()) // Output: 16
fmt.Println(rect.Scale(2)) // Output: 30El receptor (r Rectangle) te permite acceder a los campos de la estructura dentro del método usando la variable receptora r. Los métodos pueden llamar a otros métodos en la misma estructura.
Desafío
IntermedioAgrega tres métodos a la estructura Circle:
Area— devuelvemath.Pi * radius * radiusCircumference— devuelve2 * math.Pi * radiusDescribe— devuelve un string:"Circle with radius X.XX"
Hoja de referencia
Los métodos en Go son funciones con un argumento receptor especial que asocia la función con un tipo struct.
Sintaxis de los métodos:
func (receiverName StructType) MethodName() ReturnType {
// method body
}Ejemplo con un struct y métodos:
type Rectangle struct {
Width float64
Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func (r Rectangle) Perimeter() float64 {
return 2 * (r.Width + r.Height)
}Los métodos pueden aceptar parámetros:
func (r Rectangle) Scale(factor float64) float64 {
return r.Area() * factor
}Llamada a métodos:
rect := Rectangle{Width: 5, Height: 3}
fmt.Println(rect.Area()) // Output: 15
fmt.Println(rect.Perimeter()) // Output: 16
fmt.Println(rect.Scale(2)) // Output: 30El receptor permite acceder a los campos del struct dentro del método. Los métodos pueden llamar a otros métodos del mismo struct.
Pruébalo tú mismo
package main
import "fmt"
func main() {
var radius float64
fmt.Scan(&radius)
c := Circle{Radius: radius}
fmt.Printf("Area: %.2f\n", c.Area())
fmt.Printf("Circumference: %.2f\n", c.Circumference())
fmt.Printf("Description: %s\n", c.Describe())
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de POO en Go
Archivos externosEspacio de trabajo y módulos de GoPaquetes e importacionesNombres exportados vs. no exportadosIntroducción a la POO en GoStructs como clasesDefinición de métodos en structsReceptores de puntero vs. de valorInicialización de structsFunciones constructorasResumen - Calculadora simple4Interfaces
Introducción a las interfacesImplementación implícitaLa interfaz como contratoInterfaz vacía (any)Type AssertionType SwitchComposición de interfacesInterfaces Stringer y ErrorResumen: Calculadora de figuras7Encapsulamiento
Campos exportados vs. no exportadosEncapsulamiento a nivel de paqueteMétodos Getter y SetterOcultamiento de información en GoResumen - Registros de estudiantes10Genéricos (Go 1.18+)
Introducción a los GenéricosParámetros de tipoRestricciones de tipoStructs genéricosSolución alternativa para métodos genéricosResumen - Colección genérica13Patrones de diseño - Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón Abstract FactoryPatrón ObserverPatrón Strategy2Inmersión profunda en Tipos y Structs
Tipos básicos y compuestosDefiniciones de tipos personalizadosEtiquetas de StructsStructs anónimosStructs anidadosValores cero y por defectoRepaso - Libreta de contactos5Composición sobre herencia
Por qué Go no tiene herenciaConceptos básicos de incrustación de structsPromoción de métodosIncrustación de múltiples structsIncrustación vs AgregaciónShadowing de métodos incrustadosResumen - Jerarquía de empleados8Manejo de Errores y OOP
La interfaz errorTipos de errores personalizadosEnvoltura de errores (fmt.Errorf)Errores centinelaerrors.Is() y errors.As()Panic, Defer y RecoverResumen - Analizador de archivos3Punteros y Memoria
Fundamentos de punteros en GoPunteros a StructsPaso por valor vs referenciaLa función new()Garbage Collection en GoResumen - Constructor de Linked List6Polimorfismo en Go
Polimorfismo mediante interfacesDuck Typing en GoReglas de satisfacción de interfacesColecciones polimórficasInyección de dependenciasResumen - Procesador de pagos9Concurrencia y POO
Fundamentos de GoroutinesChannels y comunicaciónChannels con buffer vs. sin bufferSentencia Selectsync.Mutex y sync.RWMutexsync.WaitGroupDiseño de estructuras Thread-SafeResumen - Worker Pool