Avatar ·

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

¡Hola a todos! Acabo de empezar a estudiar Go y me confundí con dos funciones integradas: make() y new(). En la documentación dice que ambas asignan memoria, pero no entiendo cuándo usar cada una.

Aquí hay un ejemplo simple que me confunde. Quiero crear un map y un slice:

// Opción 1: con new()
m := new(map[string]int)
s := new([]int)

// Opción 2: con make()
m2 := make(map[string]int)
s2 := make([]int, 5)

La primera opción compila, pero al intentar agregar un valor al map con m["clave"] = 1 obtengo un panic: assignment to entry in nil map. Con el slice también hay problema — s[0] = 10 falla con nil pointer. En cambio, la segunda opción funciona perfectamente.

¿Cuál es la magia aquí? ¿Por qué new() no funciona para map y slice? Leí que new() devuelve un puntero, y make() no, pero eso no explica por qué uno funciona y el otro no. Explíquenme, por favor, para novatos.