Sobes.tech
Middle

O que acontece se adicionarmos elementos demais a um slice dentro de uma função?

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 adicionar elementos demais a um slice, ultrapassando a sua capacidade atual, o Go irá automaticamente alocar um novo array de maior tamanho e copiará os dados para lá.

Isto significa que ao adicionar elementos, o slice pode ser realocado, o que acarreta custos adicionais de tempo e memória. Se adicionar elementos a um slice dentro de uma função sem retornar um novo slice, as alterações podem não ser guardadas, pois o slice é passado por valor (a estrutura é copiada, mas não os dados).

Exemplo:

func appendElements(s []int) {
    for i := 0; i < 1000; i++ {
        s = append(s, i) // cria um novo slice ao ultrapassar a capacidade
    }
}

// Para que as alterações sejam mantidas, é necessário retornar o slice:
func appendElementsCorrect(s []int) []int {
    for i := 0; i < 1000; i++ {
        s = append(s, i)
    }
    return s
}

Assim, ao adicionar uma grande quantidade de elementos, é importante considerar a realocação de memória e trabalhar corretamente com o valor retornado do slice.