Sobes.tech
Middle

O ile zwiększa się rozmiar slice'a przy użyciu funkcji append?

sobes.tech AI

Odpowiedź od AI

Rozmiar slice może zwiększać się na różne sposoby w zależności od bieżącej pojemności cap(slice):

  1. Jeśli pojemność jest niewystarczająca: Nowa pojemność będzie co najmniej dwukrotnie większa od obecnej, jeśli ta jest mniejsza niż 1024. Jeśli jest większa niż 1024, pojemność zwiększy się o około 25% obecnej pojemności, aż będzie wystarczająca. Następnie może zostać dostosowana w górę.
  2. Jeśli pojemność jest wystarczająca: Rozmiar slice'a zwiększa się dokładnie o liczbę dodanych elementów, a pojemność nie ulega zmianie.
// Przykład zachowania append przy braku wystarczającej pojemności
s := make([]int, 0, 0) // rozmiar 0, pojemność 0
s = append(s, 1)       // rozmiar 1, pojemność 1. (0 -> 1)
s = append(s, 2)       // rozmiar 2, pojemność 2. (1 -> 2)
s = append(s, 3)       // rozmiar 3, pojemność 4. (2 -> 4)
s = append(s, 4)       // rozmiar 4, pojemność 4
s = append(s, 5)       // rozmiar 5, pojemność 8. (4 -> 8)

s2 := make([]int, 0, 1025) // rozmiar 0, pojemność 1025
s2 = append(s2, make([]int, 500)...) // rozmiar 500, pojemność 1025 (wystarczająca)
s2 = append(s2, make([]int, 1000)...) // rozmiar 1500, pojemność około 1025 + 1025*0.25 + epsilon

Konkretny algorytm zwiększania pojemności znajduje się w runtime i może się różnić między wersjami Go. Jednak ogólne zasady (podwajanie do 1024, zwiększanie o około 25% po tym) pozostają niezmienne.