Este post será breve, trata se de uma explicação das funções embutidas make() e new().
A função embutida new aloca espaço na memória para um determinado tipo, e retorna um ponteiro para este endereço recém alocado
var i *int
i = new(int)
fmt.Printf(“> %d”, *i)
Note que a nossa posição de memória já está inicializada com o seu respectivo zerovalue, no caso 0, mas isto será abordado em outro post.
A função make funciona apenas para as primitivas slice, chanel e map, esses tipos em especial não podem ser apenas alocados, eles também precisam ser inicializados, com valores específicos. Segundo o documento oficial Effective GO estes tipos, são na verdade estruturas de dados que precisam ter seus campos preenchidos com os devidos valores. No caso do tipo slice por exemplo, trata se de uma estrutura com os campos, data (referência para um array), tamanho e capacidade. Diferente da função new a função make não retorna um ponteiro, mas sim um valor.
var s []int = make([]int, 10)
fmt.Prinln(s)
d := make(int)
Saída
code/make-vs-new.go:16: cannot make type int
Apesar da ambiguidade que os termos make e new podem gerar, essas duas funções tem propósitos totalmente diferente. A função new realiza alocação de memória de forma similar a função maloc da linguagem C, enquanto a função make tem o propósito de inicializar primitivas especiais da linguagem.
Até a próxima 🚀
For any feedback or corrections, please write in to: georgio.barbosa@gmail.com