MyTetra Share
Делитесь знаниями!
Массивы в Golang
Время создания: 12.11.2020 18:20
Автор: br0ke
Текстовые метки: go, golang, array, arrays, for, loop
Раздел: Информационные технологии - Golang
Запись: and-semakin/mytetra_data/master/base/1605187239952hh6uinz/text.html на raw.githubusercontent.com

Массив -- это гомогенная (данные должны быть одного типа) последовательность фиксированной длины. В памяти массив хранится просто как уложенные подряд значения указанного типа. Длина массива, как и тип значений, является частью его типа, поэтому типы [3]int и [5]int -- несовместимы между собой.


Пример объявления массива (если не указать значения, то они будут инициализированы нулевыми значениями, соответствующими типу):


var a [3]int

fmt.Println(a) // [0 0 0]


Массив можно инициализировать значениями прямо в процессе объявления:


var a [3]int = [3]int{1, 2, 3}

b := [3]int{1, 2, 3}

c := [...]int{1, 2, 3}

d := [3]int{1: 12}


fmt.Println(a) // [1 2 3]

fmt.Println(b) // [1 2 3]

fmt.Println(c) // [1 2 3]

fmt.Println(d) // [0 12 0]


Синтаксис [...]int{1, 2, 3} заставляет компилятор самостоятельно вычислить длину массива на основе переданных значений. Не рекомендуется использовать такой синтаксис, потому что легко получить массив не той длины, которую ожидаешь.


Также можно инициализировать значения по индексам: [3]int{1: 12}. В таком случае указанные позиции массива будут инициализированы переданными значениями, а остальные заполнятся нулевыми значениями, как обычно.


Индексация массивов начинается с нуля. Вот так можно получить доступ к элементам массива:


b := a[0] // первый элемент массива

a[2] = 5


Если попытаться получить доступ к элементу за пределами массива, то будет паника.


Отрицательные индексы не поддерживаются, потому что это может маскировать баги в программах. Если нужно получить доступ к элементу с конца массива, то нужно самостоятельно вычислить его индекс, используя длину массива.


Длину массива можно получить вот так:


var a [3]int

l := len(a)


Обход массивов в цикле осуществляется либо при помощи обращения по индексам, либо при помощи функции range:


// по индексам

for i := 0; i < len(a); i++ {

fmt.Println(a[i])

}


// через range

for index, value := range(a) {

fmt.Println(index, value)

}


// через range, если нужны только индексы

for index := range(a) {

fmt.Println(index)

}


// через range, если нужны только значения

for _, value := range(a) {

fmt.Println(index)

}


Функция range возвращает либо пары (индекс, значение), либо просто индекс -- в зависимости от количества переменных. Если же нужно получить только значения, а индексы не важны, то вместо первой переменной используется псевдо-переменная _ (подчёркивание). Важно запомнить, что функция range возвращает копию данных в переменную value, так что если хотим изменять массив в процессе его обхода, нужно присваивать изменения по индексу в массив. Изменять переменную, полученную из range, можно, но бессмысленно.


Если длина данных заранее неизвестна, то следует использовать срезы.

Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования