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.