Массивы представляют последовательность элементов определенного типа. Массив определяется следующим способом:
var numbers [число_элементов]тип_элементов
Например, массив из пяти элементов типа int:
var numbers [5]int
При таком определении все элементы массива инициализируются значениями по умолчанию. Но также можно инициализировать элементы массива другими значениями:
var numbers [5]int = [5]int{1,2,3,4,5}
Значения передаются в фигурных скобках через запятую. При этом значений не может быть больше длины массива. В данном случае длина массива равна 5, поэтому нельзя в фигурных скобках определить больше пяти элементов. Но можно определить меньше элементов:
var numbers [5]int = [5]int{1,2} fmt.Println(numbers) // [1 2 0 0 0]
В этом случае элементы, для которых не указано значение, будут иметь значение по умолчанию.
Также можно применять сокращенное определение переменной массива:
numbers := [5]int{1,2,3,4,5}
Если в квадратных скобках вместо длины указано троеточие, то длина массива определяется, исходя из количества переданных ему элементов:
var numbers = [...]int{1,2,3,4,5} // длина массива 5 numbers2 := [...]int{1,2,3} // длина массива 3 fmt.Println(numbers) // [1 2 3 4 5] fmt.Println(numbers2) // [1 2 3]
При этом длина массива является частью его типа. И, к примеру, следующие два массива представляют разные типы данных, хотя они и хранят дванные одного типа:
var numbers [3]int = [3]int{1, 2, 3} var numbers2 [4]int = [4]int{1, 2, 3, 4} numbers = numbers2 // ! Ошибка
И в данном случае при присвоении мы получим ошибку, так как данные одного типа пытаемся передать переменной другого типа.
Для обращения к элементам массива применяются индексы - номера элементов. При этом нумерация начинается с нуля, то есть первый элемент будет иметь индекс 0. Индекс указывается в квадратных скобках. По индексу можно получить значение элемента, либо изменить его:
package main import "fmt" func main() { var numbers [5]int = [5]int{1,2,3,4,5} fmt.Println(numbers[0]) // 1 fmt.Println(numbers[4]) // 5 numbers[0] = 87 fmt.Println(numbers[0]) // 87 }
Индексы в массиве фактически выступают в качестве ключей, по которым можно обратиться к соответствующему значению. И в прицнипе мы можем явным образом указать, какому ключу какое значение будет соответствовать. При этому числовые ключи необязательно располагать в порядке возрастания:
colors := [3]string{2: "blue", 0: "red", 1: "green"} fmt.Println(colors[2]) // blue