Se passar um slice para uma função e adicionar um novo elemento a ele — as mudanças serão visíveis fora da função? E se a capacidade não for excedida?
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.
Se passar um slice para uma função e adicionar um novo elemento usando append, o comportamento depende da capacidade atual:
-
Se a capacidade não for excedida:
appendadicionará o elemento ao array existente apontado pelo slice. Nesse caso, as alterações serão visíveis fora da função, pois o array subjacente é compartilhado. -
Se a capacidade for excedida:
appendcriará um novo array com maior capacidade, copiará os dados e retornará um novo slice. Dentro da função, será um novo slice, mas fora dela, o slice original permanecerá inalterado a menos que atribua o resultado deappendde volta ao slice.
Exemplo:
func addElement(s []int) {
s = append(s, 10) // se a capacidade não for excedida, adiciona ao mesmo array
}
func main() {
s := make([]int, 0, 5) // capacidade 5
addElement(s)
fmt.Println(s) // [] — sem alterações, pois `append` retornou um novo slice, mas não o salvamos
s = append(s, 1, 2, 3)
s = append(s, 4) // capacidade não excedida
addElement(s)
fmt.Println(s) // [1 2 3 4 10] — as alterações são visíveis
}
Resumindo: para que as alterações sejam visíveis fora da função, é necessário garantir que a capacidade não seja excedida ou retornar e atribuir o resultado de append.