Avatar ·

Por que as funções make() e new() são necessárias em Go e qual a diferença entre elas?

Olá a todos! Acabei de começar a estudar Go e fiquei confuso com duas funções embutidas — make() e new(). Na documentação diz que ambas alocam memória, mas não entendo quando usar cada uma.

Aqui está um exemplo simples que me confunde. Quero criar um map e um slice:

// Opção 1: com new()
m := new(map[string]int)
s := new([]int)

// Opção 2: com make()
m2 := make(map[string]int)
s2 := make([]int, 5)

A primeira opção compila, mas ao tentar adicionar um valor ao map com m["chave"] = 1 recebo um panic: assignment to entry in nil map. Com o slice também dá problema — s[0] = 10 falha com nil pointer. Já a segunda opção funciona perfeitamente.

Qual é a mágica aqui? Por que new() não funciona para map e slice? Li que new() retorna um ponteiro, e make() não, mas isso não explica por que um funciona e o outro não. Expliquem, por favor, para um iniciante.