Pular para o conteúdo principal

victorstein.dev

33/100 Dias de Golang - make()

Table of Contents

# make()

Aproveitando o Dia 32/100 busquei no roadmap.sh sobre os tópicos que já tinha estudado e verifiquei quais pontos ainda não tinha visto ou não sabia do que se tratava. A função make() entra nos assuntos que já vi nos materias que estou usando para estudar, mas pensando com mais profundidade não sei qual a utilidade dela nem quando fazer uso da mesma. Nesse posto pretendo sanar essas dúvidas.

# Definição

A função make() server para alocar e inicializar um slice, map ou channel. Ela retorna o valor inicializado e pronto para uso. Sintaxe básica:

make(tipo, tamanho, capacidade)

Para definir um slice de tamanho 5 e capacidade 10

s := make([]int, 5, 10)
fmt.Println(len(s))
fmt.Println(cap(s))

Um map

m := make(map[string]int)
m["chave"] = 10
fmt.Println(m["chave"]) 

Um channel com buffer para 2 valores

ch := make(chan int, 2)
ch <- 1
ch <- 2
fmt.Println(<-ch)

# Diferença entre alocar uma variável “normalmente” e usar make

var m map[string]int
m["chave"] = 42

Se você tentar executar esse código vai receber um panic. Pois o mapa m foi declarado, mas não foi inicializado. Em Go, você precisa inicializar o mapa antes de usá-lo, caso contrário, ele será nil, e tentar atribuir um valor a uma chave em um mapa nil resulta em runtime panic. O correto seria inicializar o mapa com o make.

m := make(map[string]int)
m["chave"] = 42

O make inicializa a estrutura interna do tipo.

Nós sempre podemos inicializar o map com valores. Nesse caso estamos declarando e inicializando o mapa ao mesmo tempo. O compilador do Go entende que queremos criar um mapa e já o inicializa com os valores fornecidos

var x = map[string]int{
    "key1": 1,
    "key2": 2,
    "key3": 3,
}

Esse map com valores pré definidos tem um uso mais restrito, temos que conhecer os dados previamente. Preferencialmente devemos sempre escolher inicializar os maps, slices e channels com o make()