🫀El uso de Make en channels, slices, maps
En Go, la palabra clave make
se utiliza para inicializar ciertos tipos de colecciones como slices, maps y channels porque estos tipos de datos requieren una asignación y configuración especiales de memoria que no pueden realizarse simplemente con una declaración directa.
Aquí te explico por qué make
es la regla de oro para estos tipos:
1. Slices:
Los slices en Go son una estructura más compleja que un array simple. Internamente, un slice tiene un puntero a un array subyacente, una longitud y una capacidad. Usar make
garantiza que se asigne memoria tanto para el array subyacente como para el slice en sí, y que se inicialicen correctamente la longitud y capacidad.
Ejemplo:
s := make([]int, 5) // Slice con longitud 5 y capacidad 5
2. Maps:
Un map
es un tipo de colección asociativa en Go que almacena pares clave-valor. Para que funcione correctamente, necesita ser inicializado con make
, lo que asegura que la estructura de datos interna del map
esté preparada para almacenar y buscar elementos.
Ejemplo:
m := make(map[string]int) // Mapa con claves tipo string y valores tipo int
// Crear un mapa con claves de tipo string y valores de tipo int
miMapa := make(map[string]int)
// Asignar valores a las claves
miMapa["edad"] = 25
miMapa["añosDeExperiencia"] = 5
// Para eliminar un par clave-valor:
delete(miMapa, "añosDeExperiencia") // Eliminar la clave "añosDeExperiencia"
//DECLARAR E INICIALIZAR UN MAP
menu := map[string]float64{
"eggs": 1.75,
"bacon": 3.22,
"sausage": 1.89,
}
//Comprobación de la existencia de una clave:
//Se puede comprobar si una clave existe en un mapa utilizando la función len.
_, ok := m["clave5"]
if ok {
// La clave existe
} else {
// La clave no existe
}
3. Channels:
Los channels
son estructuras de comunicación entre goroutines y requieren make
para inicializar los buffers internos y configurar adecuadamente el canal para que funcione.
Ejemplo:
ch := make(chan int) // Canal no bufferizado de tipo int
¿Por qué no se usa new
?
new
?La palabra clave new
en Go solo asigna memoria para un tipo y devuelve un puntero a esa memoria, pero no inicializa estructuras complejas como lo hace make
. Por ejemplo, puedes usar new
para asignar un entero, pero no para un map
, slice
o channel
, ya que estos requieren inicializaciones adicionales.
Regla de oro:
Se debe usar make
siempre con slices, maps y channels porque asegura que estos tipos sean correctamente inicializados y listos para su uso, mientras que simplemente declarar la variable (sin make
) dejaría la estructura en su valor cero (nil
), lo cual no es funcional y causaría un panic al intentar usarlos sin inicializarlos.
Last updated