cpp

Слайсы

Слайс является оберткой над массивом. Можно сказать, что слайс — это динамический массив, т. е. массив, который может изменять размер во время выполнения программы. Слайс является структурой состоящей из трех полей. Первое поле содержит указатель на массив, второе поле — количество элементов, а третье поле — емкость, т. е. число элементов, которое может хранить массив без перераспределения памяти. Если при добавлении элемента емкости не хватает, то создается новый массив большей емкости и значения из старого массива копируются в новый массив. Указатель на новый массив сохраняется в поле, а старый массив автоматически удаляется сборщиком мусора.

Переменная в слайсе называется элементом, а ее позиция внутри слайса задается индексом. Обратите внимание на то, что нумерация элементов слайса начинается с 0, а не с 1, поэтому первый элемент имеет индекс 0.

Объявление и инициализация слайса

Объявление слайса выглядит следующим образом:

var <Переменная> []<Тип> = []<Тип>{<Значения через запятую>}

Пример объявления слайса из элементов, имеющих тип int:

var arr []int
fmt.Printf("%T\n", arr)  // []int
fmt.Println(arr)         // []
fmt.Printf("%v\n", arr)  // []
fmt.Printf("%#v\n", arr) // []int(nil)

После объявления слайс не содержит элементов вообще. Если мы произведем сравнение со значением nil, то получим равенство:

if arr == nil {
   fmt.Println("arr == nil") // arr == nil
}

При объявлении элементам слайса можно присвоить начальные значения. Для этого после объявления указывается оператор =, далее выводятся пустые квадратные скобки и после закрывающей квадратной скобки передается тип элементов слайса, а затем перечисляются значения через запятую внутри фигурных скобок. Пример инициализации слайса:

var arr []int = []int{10, 20, 30}
fmt.Println(arr) // [10 20 30]

Если выполняется инициализация, то тип данных можно не указывать:

var arr = []int{10, 20, 30}
fmt.Printf("%T\n", arr) // []int
fmt.Println(arr)        // [10 20 30]

Можно также использовать сокращенный формат объявления локальной переменной:

arr := []int{10, 20, 30}
fmt.Printf("%T\n", arr) // []int
fmt.Println(arr)        // [10 20 30]

Допускается указывать значения на отдельных строках. В этом случае после последнего значения должна стоять завершающая запятая или закрывающая фигурная скобка:

arr := []int{
   10,
   20,
   30, // Завершающая запятая обязательна!
}
fmt.Println(arr)        // [10 20 30]
arr2 := []int{
   40,
   50,
   60}
fmt.Println(arr2)        // [40 50 60]

Внутри фигурных скобок перед значениями можно указать индекс и двоеточие. В этом случае элементы могут быть перечислены в произвольном порядке:

arr := []int{2: 30, 1: 20, 0: 10}
fmt.Println(arr)       // [10 20 30]

Пример присваивания слайса после объявления:

var arr []int
arr = []int{10, 20, 30}
fmt.Println(arr)         // [10 20 30]

Для создания слайса из определенного числа элементов предназначена глобальная функция make(). Формат функции:

make(<Тип слайса>, <Число элементов>[, <Емкость>]) Type

Пример создания слайса из трех элементов:

var arr []int = make([]int, 3)
fmt.Println(arr)         // [0 0 0]
fmt.Println(len(arr))    // 3 (размер)
fmt.Println(cap(arr))    // 3 (емкость)

В результате такого объявления создается слайс из трех элементов, имеющих значения по умолчанию для типа. Напомню, что для числовых типов значением по умолчанию является 0, для строк — пустая строка, для указателей — значение nil.

Если заранее известно примерное максимальное число элементов, то дополнительно следует указать емкость слайса в третьем параметре функции make():

var arr []int = make([]int, 3, 10)
fmt.Println(arr)         // [0 0 0]
fmt.Println(len(arr))    // 3 (размер)
fmt.Println(cap(arr))    // 10 (емкость)

В этом случае размер слайса может быть увеличен до 10 элементов без перераспределения памяти.

Байтовый и символьный слайс можно инициализировать тремя способами:

  • указав коды байтов или символов внутри фигурных скобок:
var arr1 = []byte{116, 101, 115, 116}
var arr2 = []rune{116, 101, 115, 116}
fmt.Println(arr1) // [116 101 115 116]
fmt.Println(arr2) // [116 101 115 116]
  • указав символьные литералы внутри фигурных скобок:
var arr1 = []byte{'t', 'e', 's', 't'}
var arr2 = []rune{'t', 'e', 's', 't'}
fmt.Println(arr1) // [116 101 115 116]
fmt.Println(arr2) // [116 101 115 116]
  • указав строку внутри круглых скобок:
var arr1 = []byte("test")
var arr2 = []rune("test")
fmt.Println(arr1) // [116 101 115 116]
fmt.Println(arr2) // [116 101 115 116]

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp