Sobes.tech
Middle

Qual é o aumento do tamanho do slice ao usar a função append?

sobes.tech IA

Resposta da IA

O tamanho do slice pode aumentar de diferentes formas dependendo da capacidade atual cap(slice):

  1. Se a capacidade não for suficiente: A nova capacidade será pelo menos o dobro da capacidade atual, se esta for menor que 1024. Se for maior que 1024, a capacidade aumentará em 25% da capacidade atual até que seja suficiente. Depois, pode ser ajustada para cima.
  2. Se a capacidade for suficiente: O tamanho do slice aumenta exatamente pelo número de elementos adicionados, e a capacidade não muda.
// Exemplo de comportamento do append quando não há capacidade suficiente
s := make([]int, 0, 0) // tamanho 0, capacidade 0
s = append(s, 1)       // tamanho 1, capacidade 1. (0 -> 1)
s = append(s, 2)       // tamanho 2, capacidade 2. (1 -> 2)
s = append(s, 3)       // tamanho 3, capacidade 4. (2 -> 4)
s = append(s, 4)       // tamanho 4, capacidade 4
s = append(s, 5)       // tamanho 5, capacidade 8. (4 -> 8)

s2 := make([]int, 0, 1025) // tamanho 0, capacidade 1025
s2 = append(s2, make([]int, 500)...) // tamanho 500, capacidade 1025 (capacidade suficiente)
s2 = append(s2, make([]int, 1000)...) // tamanho 1500, capacidade aproximadamente 1025 + 1025*0.25 + epsilon

O algoritmo específico para crescimento de capacidade está dentro do runtime e pode mudar entre versões do Go. No entanto, as regras gerais (dobrar até 1024, aumentar em cerca de 25% depois) permanecem.