НАЙКРАЩИЙ САЙТ ДЛЯ ВЕБ-РОЗРОБНИКІВ
Golang. Уроки для початківців

En

Go Доступ, зміна, додавання та копіювання слайсів


Доступ до елементів слайсу

Ви можете отримати доступ до певного елемента слайсу, посилаючись на номер індексу.

У Go індекси починаються з 0. Це означає, що [0] є першим елементом, [1] є другим елементом тощо.

Приклад

У цьому прикладі показано, як отримати доступ до першого та третього елементів у сегменті цін:

package main
import ("fmt")

func main() {
  prices := []int{10,20,30}

  fmt.Println(prices[0])
  fmt.Println(prices[2])
}

Результат:

10
30
Спробуйте самі »

Змінити елементи слайсу

Ви також можете змінити певний елемент слайсу, посилаючись на номер індексу.

Приклад

У цьому прикладі показано, як змінити третій елемент у слайсі (сегменті) цін:

package main
import ("fmt")

func main() {
  prices := []int{10,20,30}
  prices[2] = 50
  fmt.Println(prices[0])
  fmt.Println(prices[2])
}

Результат:

10
50
Спробуйте самі »

Додавання елементів до слайсу

Ви можете додавати елементи в кінець слайсу за допомогою функції append():

Синтаксис

slice_name = append(slice_name, element1, element2, ...)

Приклад

У цьому прикладі показано, як додавати елементи до кінця слайсу:

package main
import ("fmt")

func main() {
  myslice1 := []int{1, 2, 3, 4, 5, 6}
  fmt.Printf("myslice1 = %v\n", myslice1)
  fmt.Printf("length = %d\n", len(myslice1))
  fmt.Printf("capacity = %d\n", cap(myslice1))

  myslice1 = append(myslice1, 20, 21)
  fmt.Printf("myslice1 = %v\n", myslice1)
  fmt.Printf("length = %d\n", len(myslice1))
  fmt.Printf("capacity = %d\n", cap(myslice1))
}

Результат:

myslice1 = [1 2 3 4 5 6]
length = 6
capacity = 6
myslice1 = [1 2 3 4 5 6 20 21]
length = 8
capacity = 12
Спробуйте самі »

Додати один слайс до іншого слайсу

Щоб додати всі елементи одного слайсу до іншого слайсу, скористайтеся функцією append():

Синтаксис

slice3 = append(slice1, slice2...)

Примітка: '...' після slice2 є необхідним під час додавання елементів одного слайсу до іншого.

Приклад

У цьому прикладі показано, як додати один слайс до іншого слайсу:

package main
import ("fmt")

func main() {
  myslice1 := []int{1,2,3}
  myslice2 := []int{4,5,6}
  myslice3 := append(myslice1, myslice2...)

  fmt.Printf("myslice3=%v\n", myslice3)
  fmt.Printf("length=%d\n", len(myslice3))
  fmt.Printf("capacity=%d\n", cap(myslice3))
}

Результат:

myslice3=[1 2 3 4 5 6]
length=6
capacity=6
Спробуйте самі »

Змінити довжину слайсу

На відміну від масивів, довжину слайсу можна змінювати.

Приклад

У цьому прикладі показано, як змінити довжину слайсу:

package main
import ("fmt")

func main() {
  arr1 := [6]int{9, 10, 11, 12, 13, 14} // Масив
  myslice1 := arr1[1:5] // Масив слайсів
  fmt.Printf("myslice1 = %v\n", myslice1)
  fmt.Printf("length = %d\n", len(myslice1))
  fmt.Printf("capacity = %d\n", cap(myslice1))

  myslice1 = arr1[1:3] // Змінити довжину, повторно розрізавши масив
  fmt.Printf("myslice1 = %v\n", myslice1)
  fmt.Printf("length = %d\n", len(myslice1))
  fmt.Printf("capacity = %d\n", cap(myslice1))

  myslice1 = append(myslice1, 20, 21, 22, 23) // Змінити довжину, додаючи елементи
  fmt.Printf("myslice1 = %v\n", myslice1)
  fmt.Printf("length = %d\n", len(myslice1))
  fmt.Printf("capacity = %d\n", cap(myslice1))
}

Результат:

myslice1 = [10 11 12 13]
length = 4
capacity = 5
myslice1 = [10 11]
length = 2
capacity = 5
myslice1 = [10 11 20 21 22 23]
length = 6
capacity = 10
Спробуйте самі »

Ефективність пам’яті

Під час використання фрагментів Go завантажує всі основні елементи в пам’ять.

Якщо масив великий і вам потрібно лише кілька елементів, краще скопіювати ці елементи за допомогою функції copy().

Функція copy() створює новий базовий масив лише з необхідними елементами для слайсу. Це зменшить пам’ять, яку використовує програма.

Синтаксис

copy(dest, src)

Функція copy() отримує два слайси dest та src і копіює дані з src до dest. Він повертає кількість скопійованих елементів.

Приклад

У цьому прикладі показано, як використовувати функцію copy():

package main
import ("fmt")

func main() {
  numbers := []int{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}
  // Оригінальний слайс
  fmt.Printf("numbers = %v\n", numbers)
  fmt.Printf("length = %d\n", len(numbers))
  fmt.Printf("capacity = %d\n", cap(numbers))

  // Створити копію лише з необхідними числами
  neededNumbers := numbers[:len(numbers)-10]
  numbersCopy := make([]int, len(neededNumbers))
  copy(numbersCopy, neededNumbers)

  fmt.Printf("numbersCopy = %v\n", numbersCopy)
  fmt.Printf("length = %d\n", len(numbersCopy))
  fmt.Printf("capacity = %d\n", cap(numbersCopy))
}

Результат:

// Оригінальний слайс
numbers = [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]
length = 15
capacity = 15
// Новий слайс
numbersCopy = [1 2 3 4 5]
length = 5
capacity = 5
Спробуйте самі »

Ємність нового слайсу тепер менша за ємність вихідного слайсу, оскільки новий базовий масив менший.