Sobes.tech
Middle

Ҳаҷми slice чӣ қадар зиёд мешавад вақте ки функсияи append истифода мешавад?

sobes.tech AI

Ҷавоб аз AI

Андозаи слайс метавонад дар роҳҳои гуногун афзоиш ёбад, вобаста ба қобилияти ҳозира cap(slice):

  1. Агар қобилият кофӣ набошад: Қобилияти нав ҳадди аққал ду баробар аз қобилияти ҳозира хоҳад буд, агар он аз 1024 камтар бошад. Агар аз 1024 зиёд бошад, қобилият тақрибан 25% аз қобилияти ҳозира афзоиш ёфта, то он ки кофӣ шавад. Пас метавонад ба боло танзим карда шавад.
  2. Агар қобилият кофӣ бошад: Андозаи слайс дар асл ба миқдори элементҳои иловашуда афзоиш меёбад, ва қобилият тағир намеёбад.
// Намунаи рафтори 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% пасон) боқӣ мемонанд.