Middle
Ի՞նչ չափով է մեծանում slice-ի չափը, երբ օգտագործվում է append ֆունկցիան։
sobes.tech AI
Պատասխան AI-ից
Սլայսի չափը կարող է տարբեր կերպ աճել, կախված ընթացիկ ծավալից cap(slice):
- Եթե ծավալը բավարար չէ: Նոր ծավալը կլինի առնվազն երկու անգամ ավելի մեծ ընթացիկից, եթե այն փոքր է 1024-ից: Եթե այն մեծ է 1024-ից, ծավալը կավելանա մոտ 25%-ով ընթացիկից մինչև որ դառնա բավարար: Այնուհետև կարող է վերանայվել վերև:
- Եթե ծավալը բավարար է: Սլայսի չափը ճիշտ կհավասարվի ավելացված տարրերի քանակին, և ծավալը չի փոխվի:
// Append-ի վարքագծի օրինակ, երբ ծավալը բավարար չէ
s := make([]int, 0, 0) // չափ 0, ծավալ 0
s = append(s, 1) // չափ 1, ծավալ 1. (0 -> 1)
s = append(s, 2) // չափ 2, ծավալ 2. (1 -> 2)
s = append(s, 3) // չափ 3, ծավալ 4. (2 -> 4)
s = append(s, 4) // չափ 4, ծավալ 4
s = append(s, 5) // չափ 5, ծավալ 8. (4 -> 8)
s2 := make([]int, 0, 1025) // չափ 0, ծավալ 1025
s2 = append(s2, make([]int, 500)...) // չափ 500, ծավալ 1025 (բավարար)
s2 = append(s2, make([]int, 1000)...) // չափ 1500, մոտ 1025 + 1025*0.25 + epsilon
Հատուկ ալգորիթմը ծավալի աճի համար գտնվում է runtime-ի ներսում և կարող է փոխվել տարբեր Go տարբերակների միջև: Սակայն, ընդհանուր կանոնները (երկակի կրկնապատկում մինչև 1024, մոտ 25%-ով աճ հետո) մնում են ուժի մեջ։