devterview_$ iniciar simulação

Slice x array e o compartilhamento de backing array

MédioPlenoFundamentos da linguagem

Pergunta

Qual a diferença entre um array e um slice em Go, e que bug surge quando dois slices compartilham o mesmo backing array?

Resposta esperada

Um array (`[3]int`) tem tamanho fixo no tipo e é copiado ao ser atribuído/passado. Um slice (`[]int`) é um cabeçalho leve — ponteiro pro backing array, `len` e `cap` — que aponta pra um array subjacente. Fatiar um slice (`s[1:3]`) NÃO copia os dados: o novo slice compartilha o mesmo backing array. Bugs: (1) modificar `s2[0]` altera `s1` também se eles se sobrepõem; (2) `append` que cabe na capacidade escreve NO backing array compartilhado (pode sobrescrever dados de outro slice), mas `append` que estoura a capacidade realoca e passa a ser independente — comportamento inconsistente que confunde; (3) guardar um slice pequeno de um array enorme mantém o array todo vivo na memória (não é coletado). Pra cópia independente use `copy()` ou `append([]T(nil), s...)`. Fatiar com 'full slice expression' `s[a:b:b]` limita a capacidade e evita o append acidental no compartilhado.

Por que perguntam isso

Pergunta pleno de Go. Sinais de domínio: 'append que cabe na cap vs realoca', full slice expression `s[a:b:b]`, e o array grande preso na memória.

#slices#arrays#backing-array#append
publicidade

Perguntas de acompanhamento

Relacionadas