Menu
Coddy logo textTech

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)   // 0

Quizá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.

challenge icon

Desafío

Fácil

Construyamos 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 estructura ServerConfig con los campos Host (string), Port (int), MaxConnections (int) y DebugMode (bool). Crea dos funciones:
    • NewServerConfig, que usa new() para asignar una ServerConfig y devuelve directamente el puntero (con todos los valores cero)
    • ConfigureServer, que recibe un puntero *ServerConfig junto con un texto de host y un entero de puerto, y luego establece esos campos en la configuración a través del puntero
    También añade un método Display en *ServerConfig que 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 usando NewServerConfig() y muéstrala para mostrar los valores cero. Después, usa ConfigureServer para 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: false

Observa 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
}
quiz iconPonte a prueba

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

Practica por tu cuenta: Compilador de Go online