Avatar ·

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

Olá a todos! Comecei a estudar Go recentemente e não consigo entender por que são necessárias duas funções separadas para alocar memória: make() e new(). Ambas parecem criar objetos, mas os exemplos da documentação só me confundiram.

Aqui está o que estou tentando fazer. Quero criar um slice e adicionar elementos imediatamente:

package main

import "fmt"

func main() {
    // Tentando criar um slice com new
    slice1 := new([]int)
    fmt.Println(slice1)  // Exibe: &[]
    // Mas como adicionar um elemento? slice1 = append(slice1, 1) não funciona
    // Erro: first argument to append must be slice; have *[]int

    // Tentando criar um slice com make
    slice2 := make([]int, 5)
    fmt.Println(slice2) // Exibe: [0 0 0 0 0]
    // Funciona, mas por que o comprimento é 5? Pode ser sem comprimento?

    // E com map é a mesma história
    var m1 map[string]int
    // m1["key"] = 1 // panic: assignment to entry in nil map

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