sobre new(struct)

2 0 0
                                        

- Si por ejemplo se tiene: type MyStruct struct{} que diferencia hay, como es recomendable y en que casos se prefiere usar una declaración de variable normal en lugar de new(MyStruct)

La diferencia principal está en cómo se inicializa y el tipo de referencia que obtienes.

// Definición de la estructura

type MyStruct struct { Name string Age int}


1. Declaración normal

var s1 MyStruct // Crea un valor de tipo MyStruct con valores zero

s2 := MyStruct{} // Igual que arriba pero con inferencia de tipo

s3 := MyStruct{ Name: "Juan", Age: 25 } // Inicialización con valores específicos


2. Usando new()

s4 := new(MyStruct) // Retorna un puntero (*MyStruct) con valores zero


// Diferencias en uso:

// Con declaración normal (s1, s2, s3)

func ejemplo1() { 

 s1 := MyStruct{} 

 s1.Name = "Zero" // Modifica directamente el valor 

 funcQueEsperaValor(s1) // Pasa una copia 

 funcQueEsperaPuntero(&s1) // Pasa la dirección

}


// Con new() (s4)

func ejemplo2() { 

 s4 := new(MyStruct)

 s4.Name = "Zero" // Modifica a través del puntero automáticamente

 funcQueEsperaValor(*s4) // Necesita dereferenciación 

 funcQueEsperaPuntero(s4) // Pasa directamente el puntero

}


// Función que espera un valor

func funcQueEsperaValor(s MyStruct) { 

 s.Name = "Zero" // Modifica una copia

}

// Función que espera un puntero

func funcQueEsperaPuntero(s *MyStruct) {

 s.Name = "Zero" // Modifica el original

}


Recomendaciones de uso:

1. Usa declaración normal (MyStruct{}) cuando:

- Necesitas un valor, no un puntero

- La estructura es pequeña

- No vas a modificar el valor en otras funciones

- Quieres inicializar campos específicos

Ej: config := Config{ Port: 8080, Host: "localhost" }

2. Usa new() cuando:

- Necesitas específicamente un puntero

- La estructura es grande y quieres evitar copias

- Vas a modificar el valor en otras funciones

Ej: 

user := new(User)

user.Name = "Zero"

updateUserInDB(user)


La elección entre uno u otro dependerá de:

- Tamaño de la estructura

- Si necesitas modificar el valor

- Si trabajas con interfaces

- Requisitos de rendimiento

- Claridad del código

En general, la tendencia moderna en Go es usar la declaración normal a menos que tengas una razón específica para usar punteros.

You've reached the end of published parts.

⏰ Last updated: Feb 12 ⏰

Add this story to your Library to get notified about new parts!

zero golang notesWhere stories live. Discover now