Slice x array e o compartilhamento de backing array
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.