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):
- 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ę.
- 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.