Шаг 46.
Язык программирования Go.
Многомерные массивы и срезы
На этом шаге рассмотрим примеры многомерных массивов и многомерных срезов в Go.
Массивы в языке Go – это последовательности элементов одного типа фиксированной длины. Многомерные массивы могут создаваться за
счет использования элементов, которые сами являются массивами.
Приведем несколько примеров, демонстрирующих способы создания массивов и доступа к их элементам.
Задание 1. Заполним двумерную матрицу NxN следующим образом (рис.1):
Рис.1. Пример заполнения двумерного массива
Раскрыть/скрыть решение и комментарии.
var grid [10][10] int
for i = 0; i < n; i++ {
for j = 0; j < n; j++ {
if i % 2 == 1 {
grid[i][j] = n * (i + 1) - j
} else {
grid[i][j] = i * n + j + 1
}
fmt.Printf("\t%d", grid[i][j])
}
fmt.Print("\n")
}
fmt.Printf("%-8T %2d %v\n", grid, len(grid), grid)
В языке Go гарантируется, что все элементы массива будут инициализированы соответствующими нулевыми значениями, если они
не будут инициализированы явно при создании.
Длину массива можно получить с помощью функции len(). Поскольку массивы имеют фиксированную длину, их емкость всегда
равна их длине. Из массива можно
извлечь срез, используя тот же синтаксис извлечения срезов, как и в
случае со строками или срезами, только результатом такой операции
будет срез, а не массив. И подобно строкам и срезам, итерации по
массивам можно выполнять с помощью цикла for ...range:
r := rand.New(rand.NewSource(time.Now().UnixNano()))
//заполнение массива случайными значениями от 1 до 9
for a := range grid {
for b := range grid {
grid[a][b] = r.Intn(9) + 1
}
}
fmt.Printf("%v", grid)
Архив примера можно взять здесь.
Срезы – это последовательности элементов одного типа фиксированной емкости и переменной длины. Несмотря на фиксированную
емкость, срезы могут укорачиваться путем их усечения и удлиняться с помощью встроенной функции append(). Многомерные срезы можно создавать,
используя элементы, которые сами являются срезами, при этом длины внутренних срезов в многомерном срезе могут быть разными.
Приведем пример, демонстрирующих способ создания среза и доступ к его элементам.
Задание 2. Заполним двумерный срез значениями, определим длину и емкость среза.
Раскрыть/скрыть решение и комментарии.
grid1 := make([][]int, 3)
for i := range grid1 {
grid1[i] = make([]int, 3)
}
grid1[1][0], grid1[1][1], grid1[1][2] = 8, 6, 2
grid2 := [][]int{{0}, {1, 2}, {3, 4, 5}}
fmt.Println("Тип Длина Емкость Содержимое")
fmt.Printf("%-8T %2d %3d %v\n", grid1, len(grid1), cap(grid1), grid1)
fmt.Printf("%-8T %2d %3d %v\n", grid2, len(grid2), cap(grid2), grid2)
fmt.Printf("%-8T %2d %3d %v\n", grid2[0], len(grid2[0]), cap(grid2[0]), grid2[0])
fmt.Printf("%-8T %2d %3d %v\n", grid2[1], len(grid2[1]), cap(grid2[1]), grid2[1])
fmt.Printf("%-8T %2d %3d %v\n", grid2[2], len(grid2[2]), cap(grid2[2]), grid2[2])
}
Срез grid1 создан как срез срезов с начальной длиной 3 (то есть он может содержать три среза) и емкостью 3 (так как по умолчанию емкость устанавливается равной длине, если явно не указано другое
значение). Затем каждому элементу среза grid1 присваивается свой
срез из трех элементов. Естественно, при необходимости внутренние
срезы могли бы иметь разные длины.
Срез grid2 создается с использованием синтаксиса составных
литералов, и для него указываются значения всех его элементов, так как в этом случае компилятор Go не имеет другой возможности
определить желаемое количество элементов. Здесь внутренние срезы имеют разныме длины.
Архив примера можно взять здесь.
На следующем шаге рассмотрим индексирование срезов
и извлечение срезов из срезов в Go.
Предыдущий шаг
Содержание
Следующий шаг