cpp

Массивы и слайсы

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

Массивы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В этом примере первому элементу массива присваивается значение 10, второму — значение 20, а третьему элементу будет присвоено значение по умолчанию 0.

Если число значений внутри фигурных скобок больше размера массива, то будет ошибка при компиляции:

arr := [3]int{10, 20, 30, 40} // Ошибка!
// array index 3 out of bounds [0:3]

Присвоить всем элементам массива значение по умолчанию можно так:

arr := [3]int{}
fmt.Println(arr)        // [0 0 0]

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

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

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

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

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

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

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

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

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

  • указав коды байтов или символов внутри фигурных скобок:
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]
Обратите внимание

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

Помощь сайту

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

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

cpp