Avatar ·

¿Por qué Go necesita las funciones make() y new()? ¿Cuál es la diferencia?

¡Hola a todos! Empecé a estudiar Go recientemente y no puedo entender por qué se necesitan dos funciones separadas para asignar memoria: make() y new(). Ambas parecen crear objetos, pero los ejemplos de la documentación solo me confundieron.

Esto es lo que intento hacer. Quiero crear un slice y agregarle elementos inmediatamente:

package main

import "fmt"

func main() {
    // Intento crear un slice con new
    slice1 := new([]int)
    fmt.Println(slice1)  // Muestra: &[]
    // Pero ¿cómo agregar un elemento? slice1 = append(slice1, 1) no funciona
    // Error: first argument to append must be slice; have *[]int

    // Intento crear un slice con make
    slice2 := make([]int, 5)
    fmt.Println(slice2) // Muestra: [0 0 0 0 0]
    // Funciona, pero ¿por qué la longitud es 5? ¿Se puede sin longitud?

    // Y con map pasa lo mismo
    var m1 map[string]int
    // m1["key"] = 1 // panic: assignment to entry in nil map

    m2 := make(map[string]int)
}