Sobes.tech
Middle+

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: append adicionará 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: append criará 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 de append de 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.