Senior
O que é um slice? O que está por trás de um slice? Como funciona a função append?
sobes.tech IA
Resposta da IA
Em Go, um slice é um array dinâmico que representa uma estrutura com três campos:
- Ponteiro para o array (array subjacente na memória)
- Comprimento (len) — número de elementos disponíveis no slice
- Capacidade (cap) — quantidade máxima de elementos que o array subjacente pode conter a partir do ponteiro
Por trás dos panos, um slice é uma pequena estrutura, aproximadamente assim:
type sliceHeader struct {
Data uintptr // ponteiro para o primeiro elemento do array
Len int
Cap int
}
A função append adiciona elementos ao slice. Se o comprimento do slice for menor que a capacidade, append simplesmente escreve os novos elementos no array subjacente e aumenta o comprimento. Se o comprimento atingir a capacidade, append aloca um novo array com maior capacidade (normalmente o dobro), copia os elementos antigos, adiciona os novos, e retorna um novo slice com o ponteiro atualizado.
Exemplo:
s := []int{1, 2, 3}
s = append(s, 4) // se cap(s) > len(s), simplesmente adiciona 4
// se cap(s) == len(s), aloca um novo array, copia [1,2,3], adiciona 4
Dessa forma, append pode retornar um novo slice, e é importante atribuir o resultado novamente.