Не існує більш стислого способу: те, що ви зробили, це "правильний" шлях; оскільки фрагменти завжди є одновимірними, але можуть складатися для побудови об'єктів більш високого розміру. Детальніше див. У цьому питанні: Перейдіть: Як представлено пам'ять двовимірного масиву .
Одне з них можна спростити, це використовувати for range
конструкцію:
a := make([][]uint8, dy)
for i := range a {
a[i] = make([]uint8, dx)
}
Також зауважте, що якщо ви ініціалізуєте свій фрагмент складеним буквалом , ви отримуєте це для "безкоштовно", наприклад:
a := [][]uint8{
{0, 1, 2, 3},
{4, 5, 6, 7},
}
fmt.Println(a) // Output is [[0 1 2 3] [4 5 6 7]]
Так, це має свої межі, оскільки, здавалося б, вам потрібно перерахувати всі елементи; але є деякі хитрощі, а саме вам не доведеться перераховувати всі значення, лише ті, які не є нульовими значеннями типу елемента фрагмента. Детальніше про це див. У розділі Ключові елементи в ініціалізації масиву golang .
Наприклад, якщо ви хочете фрагмент, де перші 10 елементів є нулями, а потім слід, 1
і 2
його можна створити так:
b := []uint{10: 1, 2}
fmt.Println(b) // Prints [0 0 0 0 0 0 0 0 0 0 1 2]
Також зауважте, що якщо ви використовуєте масиви замість фрагментів , їх можна створити дуже легко:
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]]
У разі масивів вам не доведеться повторювати "зовнішній" масив та ініціалізувати "внутрішні" масиви, оскільки масиви - це не дескриптори, а значення. Дивіться публікацію в блозі Масиви, фрагменти (та рядки): Механіка "додавання" для отримання більш детальної інформації.
Спробуйте приклади на Go Playground .
cannot use [5][2]string literal (type [5][2]string) as type [][]string in field value
коли намагаюся призначити масив тому, що, напевно, кажу, що Go - це фрагмент.