🫀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?

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