Quando usar/evitar append em seus programas

Nesse post vamos falar sobre como a função append funciona e quando devemos evitar sua utilização.

Em resumo, a função append nos ajuda a expandir um array, ou seja, se houver um array de tamanho 3 onde precisamos adicionar mais um item, o append irá aumentar o tamanho desse array para que ele comporte esse novo item.

Agora, você já se perguntou como isso acontece e qual o impacto na performance do seu programa?

Antes de falar sobre o append, vamos falar um pouco sobre como o Go armazena um array na memória.

O Go armazena os arrays de forma sequêncial na memória, ou seja, quando criamos um array de tamanho 3 o Go vai buscar um espaço na memória onde possa armazenar essas 3 posições uma do lado da outra.

Quando precisamos usar o append para adicionar mais 1 item ao array, o Go vai tentar alocar mais um espaço na sequência para adicionar esse item. No entanto caso isso não seja possível, ele irá realocar (criar um novo array) nosso array em outro local da memória onde seja possível ter esse novo espaço de forma sequêncial.

Adicionar um ou outro item ao array não deve gerar muito impacto. Agora imagine o seguinte cenário:

var people []Person
for _, name := range names {
    people = append(people, Person{name})
}

Nesse caso o append vai realocar nosso array N vezes. Sei que é óbvio, mas vale ressaltar que esse N pode ser 10.000x.

No entanto em casos como esse, onde sabemos o tamanho futuro do nosso array, existe uma outra maneira de escrever esse mesmo código, porém com uma grande econômia de memória.

people = make([]Person, len(names))
for index, name := range names {
    people[index] = Person{name}
}

Nesse segundo exemplo, antes de começar iterar pelo array de nomes nós usamos a função make para criar um array do mesmo tamanho que o array names. Assim o Go terá que fazer zero realocações do nosso array.

Para finalizar, sempre faça a seguinte pergunta antes de usar o append.

P: Eu sei o tamanho que o meu array terá?

Se a resposta for sim, crie ele com make e use indices (pode ser até algo como people[0] = Person{ Tiago }). Se a resposta for não então use o append.

Deixem suas dúvidas nos comentários.

Até a próxima!


Subscreva

Fique por dentro de tudo o que acontece no mundo Go

Deixe uma resposta