Sobes.tech
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.