Inicialización de structs
Parte de la sección Programación Orientada a Objetos del Journey de GO de Coddy — lección 9 de 107.
Go proporciona varias formas de inicializar structs, cada una útil en diferentes situaciones.
Inicialización de campos con nombre
type Person struct {
Name string
Age int
City string
}
p1 := Person{
Name: "Alice",
Age: 25,
City: "New York",
}Inicialización posicional (el orden debe coincidir con la declaración de los campos)
p2 := Person{"Bob", 30, "London"}Inicialización con valor cero (todos los campos obtienen valores por defecto)
p3 := Person{}
// Name: "", Age: 0, City: ""
Inicialización parcial (los campos no establecidos obtienen valores cero)
p4 := Person{Name: "Charlie"}
// Name: "Charlie", Age: 0, City: ""
Puntero a una estructura usando &
p5 := &Person{
Name: "Diana",
Age: 28,
City: "Paris",
}
fmt.Println(p5.Name) // DianaUsando var y luego asignando campos
var p6 Person
p6.Name = "Eve"
p6.Age = 22La inicialización de campos con nombre es el enfoque más común y legible. Utilice & cuando necesite un puntero a la estructura.
Desafío
IntermedioCrea tres objetos Player utilizando diferentes métodos de inicialización:
- player1: Inicialización de campos con nombre utilizando los valores de entrada
- player2: Inicialización de campos con nombre con Name: "Guest", Class: "Novice", HitPoints: 50
- player3: Usa la declaración
vary luego asigna cada campo individualmente
Hoja de referencia
Go proporciona varias formas de inicializar structs:
Inicialización de campos con nombre (la más común y legible):
p1 := Person{
Name: "Alice",
Age: 25,
City: "New York",
}Inicialización posicional (el orden debe coincidir con la declaración de los campos):
p2 := Person{"Bob", 30, "London"}Inicialización con valor cero (todos los campos obtienen valores por defecto):
p3 := Person{}
// Name: "", Age: 0, City: ""Inicialización parcial (los campos no establecidos obtienen valores cero):
p4 := Person{Name: "Charlie"}
// Name: "Charlie", Age: 0, City: ""Puntero a un struct usando &:
p5 := &Person{
Name: "Diana",
Age: 28,
}
fmt.Println(p5.Name) // DianaUsando var y luego asignando campos:
var p6 Person
p6.Name = "Eve"
p6.Age = 22Pruébalo tú mismo
package main
import "fmt"
func main() {
var name, class string
var hp int
fmt.Scan(&name, &class, &hp)
// TODO: Crear player1 usando la inicialización de campos con nombre con los valores de entrada
// TODO: Crear player2 usando la inicialización de campos con nombre:
// Name: "Guest", Class: "Novice", HitPoints: 50
// TODO: Crear player3 usando la declaración var, luego asignar los campos:
// Name: "Hero", Class: "Knight", HitPoints: 200
fmt.Printf("Player 1: %s (%s) - HP: %d\n", player1.Name, player1.Class, player1.HitPoints)
fmt.Printf("Player 2: %s (%s) - HP: %d\n", player2.Name, player2.Class, player2.HitPoints)
fmt.Printf("Player 3: %s (%s) - HP: %d\n", player3.Name, player3.Class, player3.HitPoints)
}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