Sobes.tech
Junior

Чӣ гуна бо slices дар Go кор кардан мумкин аст?

sobes.tech AI

Ҷавоб аз AI

Слайсҳо дар Go на массивҳо мебошанд, балки ба сегмент (ё тамоми) массиви асосиро ишора мекунанд. Инҳо структураҳои динамикӣ мебошанд.

Эҷоди слайс:

  • Аз массив:
    // муайян кардани массив
    arr := [5]int{1, 2, 3, 4, 5}
    // эҷоди слайс аз қисмати массив
    s1 := arr[1:4] // s1 дорои элементҳои arr[1], arr[2], arr[3]
    s2 := arr[:3]  // s2 дорои элементҳои arr[0], arr[1], arr[2]
    s3 := arr[2:]  // s3 дорои элементҳои arr[2], arr[3], arr[4]
    s4 := arr[:]   // s4 ишора ба тамоми массив
    
  • Бо ёрии make:
    // Эҷоди слайс бо дарозӣ 5 ва иқтидори 5
    s := make([]int, 5)
    // Эҷоди слайс бо дарозӣ 5 ва иқтидори 10
    s_cap := make([]int, 5, 10)
    
  • Литсера:
    s := []int{1, 2, 3}
    

Хусусиятҳои асосии слайс:

  • len(s): баргардонандаи дарозии ҳозираии слайс.
  • cap(s): баргардонандаи иқтидори слайс (ҳадди максимумии элементҳо, ки пеш аз reallocatable метавонанд дар он ҷойгир шаванд).

Илова кардани элементҳо (append):

s := []int{1, 2}
s = append(s, 3)      // илова кардани як элемент
s = append(s, 4, 5)   // илова кардани чанд элемент
s2 := []int{6, 7}
s = append(s, s2...) // илова кардани элементҳои дигар слайс

append метавонад realloc-кунии асосиро ба вуҷуд орад, агар иқтидори кофӣ набошад.

Боварӣ кардан дар бораи элементҳо:

Боварӣ кардан дар элементҳо аз слайс тавассути эҷоди слайси нав аз элементҳои боқимондаи ё копирашударо ё бо истифода аз copy.

s := []int{1, 2, 3, 4, 5}
// Удаление элемента по индексу i
i := 2 // удаляем элемент по индексу 2 (т.е. 3)
s = append(s[:i], s[i+1:]...)

Копирование слайсов:

src := []int{1, 2, 3}
dst := make([]int, len(src))
copy(dst, src) // копирует элементы из src в dst

copy копирует минимум из длин двух слайсов.

Итерация по слайсу:

s := []string{"a", "b", "c"}
for i, v := range s {
    // i - индекс, v - значение
}
for i := range s {
    // только индекс
}
for _, v := range s {
    // только значение
}

Слайсы являются ссылочными типами:

Изменения в слайсе отображаются на базовом массиве и других слайсах, ссылающихся на ту же область памяти.

arr := [5]int{1, 2, 3, 4, 5}
s1 := arr[1:4] // [2, 3, 4]
s2 := arr[2:5] // [3, 4, 5]

s1[0] = 99
// Теперь arr: [1, 99, 3, 4, 5]
// s1: [99, 3, 4]
// s2: [3, 4, 5] (элемент arr[2] изменился)