Существует не более краткий путь, что вы сделали это «правильный» путь; потому что срезы всегда одномерные, но могут быть составлены для построения объектов с большими размерами. См. Этот вопрос для получения более подробной информации: Go: How is two dimensional array's memory representation.
Одна вещь, вы можете упростить на нем использовать for range
конструкцию:
a := make([][]uint8, dy)
for i := range a {
a[i] = make([]uint8, dx)
}
Также обратите внимание, что если вы инициализировать кусочек с composite literal, вы получите это за «бесплатно», например:
a := [][]uint8{
{0, 1, 2, 3},
{4, 5, 6, 7},
}
fmt.Println(a) // Output is [[0 1 2 3] [4 5 6 7]]
Да, у этого есть свои пределы, поскольку, похоже, вам нужно перечислить все элементы; но есть некоторые трюки, а именно, вам не нужно перечислять все значения, только те, которые не являются zero values типа элемента среза. Для получения дополнительной информации об этом см. Keyed items in golang array initialization.
Например, если вы хотите кусок, где первые 10 элементов являются нулями, а затем следует 1
и 2
, он может быть создан так:
b := []uint{10: 1, 2}
fmt.Println(b) // Prints [0 0 0 0 0 0 0 0 0 0 1 2]
Также обратите внимание, что если вы будете использовать arrays вместо из slices, она может быть создана очень легко:
c := [5][5]uint8{}
fmt.Println(c)
Выход:
[[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]
В случае массивов вам не нужно перебирать «внешний» массив и инициализировать «внутренние» массивы, поскольку массивы не являются дескрипторами, а значениями. Дополнительную информацию см. В блоге Arrays, slices (and strings): The mechanics of 'append'.
Попробуйте примеры на Go Playground.
Кроме 'range', я не вижу разницы, что спросил OP и ваш пример кода. – eduncan911