La función new()
Parte de la sección Programación Orientada a Objetos del Journey de GO de Coddy. Lección 22 de 107.
Go proporciona una función integrada llamada new() que asigna memoria para un tipo y devuelve un puntero a ella. La memoria asignada se inicializa con el valor cero del tipo.
p := new(int) // asigna memoria para un int
fmt.Println(*p) // 0 (valor cero)
fmt.Println(p) // 0xc000018030 (dirección de memoria)La función new() toma un tipo como argumento y devuelve un puntero a un valor cero recién asignado de ese tipo. Esto es especialmente útil cuando necesitas un puntero, pero no tienes una variable existente a la que hacer referencia.
Con las estructuras, new() crea un puntero a una estructura con todos los campos establecidos en sus valores cero.
type Person struct {
Name string
Age int
}
p := new(Person)
fmt.Println(p.Name) // "" (cadena vacía)
fmt.Println(p.Age) // 0Quizás te preguntes cuándo usar new() frente al operador de dirección &. Los dos enfoques siguientes son equivalentes:
// Usando new()
p1 := new(Person)
// Usando el operador de dirección con literal
p2 := &Person{}La sintaxis &Person{} es más común en la práctica porque te permite inicializar los campos al mismo tiempo. Usa new() cuando específicamente quieras una instancia con valor cero y prefieras una semántica explícita de asignación de memoria.
Desafío
FácilConstruyamos un administrador de configuración que demuestre cómo new() asigna memoria e inicializa las estructuras con sus valores cero. Verás cómo este enfoque difiere del uso del operador de dirección con un literal de estructura.
Organizarás tu código en dos archivos:
config.go: Define una estructuraServerConfigcon los camposHost(string),Port(int),MaxConnections(int) yDebugMode(bool). Crea dos funciones:NewServerConfig, que usanew()para asignar unaServerConfigy devuelve directamente el puntero (con todos los valores cero)ConfigureServer, que recibe un puntero*ServerConfigjunto con un texto de host y un entero de puerto, y luego establece esos campos en la configuración a través del puntero
Displayen*ServerConfigque devuelva un texto formateado con todos los valores de configuración.main.go: Lee un host y un puerto de la entrada. Primero, crea una configuración usandoNewServerConfig()y muéstrala para mostrar los valores cero. Después, usaConfigureServerpara establecer el host y el puerto, y vuelve a mostrar la configuración para enseñar los valores actualizados.
Se proporcionarán las siguientes entradas:
- Línea 1: Nombre del host (texto)
- Línea 2: Número de puerto (entero)
Tu método Display debe devolver un texto con este formato exacto:
Host: [Host]
Port: [Port]
MaxConnections: [MaxConnections]
DebugMode: [DebugMode]Imprime el resultado de la visualización dos veces: una antes de configurar (mostrando los valores cero) y otra después de configurar (mostrando el host y el puerto actualizados).
Por ejemplo, dados localhost y 8080, el resultado debería ser:
Host:
Port: 0
MaxConnections: 0
DebugMode: false
Host: localhost
Port: 8080
MaxConnections: 0
DebugMode: falseObserva cómo la primera visualización muestra todos los valores cero (texto vacío, 0, 0, false) porque new() inicializa todo con valores cero. Después de llamar a ConfigureServer, solo cambian el host y el puerto, mientras que los demás campos permanecen con sus valores cero.
Pruébalo tú mismo
package main
import (
"fmt"
)
func main() {
// Leer entrada
var host string
var port int
fmt.Scanln(&host)
fmt.Scanln(&port)
// TODO: Crea una config usando NewServerConfig() y muéstrala
// Esto mostrará los valores cero
// TODO: Usa ConfigureServer para establecer el host y el port
// TODO: Muestra la config de nuevo para mostrar los valores actualizados
}
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 PoolPractica por tu cuenta: Compilador de Go online