Sobes.tech
Senior

Quando um slice é redeclarado dentro de uma função ao ultrapassar a capacidade — ele é declarado no heap ou na pilha?

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 adicionas elementos e ultrapassas a capacidade atual do slice, um novo array com maior capacidade é alocado.

Este novo array é alocado no heap, não na pilha, porque o seu tamanho e tempo de vida não podem ser determinados em tempo de compilação. Depois disso, o slice dentro da função aponta para este novo array no heap.

Exemplo:

func appendElement(s []int, val int) []int {
    s = append(s, val) // se a capacidade não for suficiente, um novo array é alocado no heap
    return s
}

Assim, ao ultrapassar a capacidade, o slice é reatribuído com um novo array que fica no heap.