- 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 ARE READING
zero golang notes
Non-FictionAlgunos apuntes de Go tomados de libros, videos, posts, etc. Comunidad: https://dsc.gg/gophers-latam
