Sobes.tech
Senior

Se eu trabalhar com um slice, pegá-lo como parâmetro de uma função, fazer algo com ele e continuar a trabalhar com ele após a função — do que preciso lembrar? Quais mudanças não veremos de fora?

sobes.tech IA

Resposta da IA

Em Go, um slice é uma estrutura que contém um ponteiro para um array, um comprimento e uma capacidade. Quando você passa um slice para uma função, apenas essa estrutura (ponteiro, comprimento, capacidade) é copiada, não o array em si.

O que é importante lembrar:

  • Alterações nos elementos do slice dentro da função (por exemplo, s[0] = 10) serão visíveis de fora, pois apontam para o mesmo array.
  • Alterações na própria estrutura do slice (por exemplo, atribuir um novo slice s = append(s, 5)) não afetarão o slice fora da função, pois apenas a estrutura é copiada.

Exemplo:

func modify(s []int) {
    s[0] = 100       // alterará o elemento do array — será visível de fora
    s = append(s, 200) // altera a cópia local do slice — não será visível de fora
}

s := []int{1, 2, 3}
modify(s)
fmt.Println(s) // Vai imprimir [100 2 3], a adição de 200 não será refletida

Resumindo, alterações nos elementos do slice são visíveis de fora, mas alterações no comprimento ou capacidade (através de append, slices) não são, a menos que retorne um novo slice ou passe um ponteiro para o slice.