より簡潔な方法はありません。あなたがしたことは「正しい」方法です。スライスは常に1次元ですが、より高次元のオブジェクトを構築するために構成されている場合があるためです。詳細については、この質問を参照してください。Go:2次元配列のメモリ表現はどうですか。
単純化できることの1つは、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
andと続く場合、次のよう2
に作成できます。
b := []uint{10: 1, 2}
fmt.Println(b) // Prints [0 0 0 0 0 0 0 0 0 0 1 2]
また、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]]
配列は記述子ではなく値なので、配列の場合、「外部」配列を反復処理して「内部」配列を初期化する必要はありません。詳細については、ブログの記事「配列、スライス(および文字列):「追加」のメカニズム」を参照してください。
Go Playgroundで例を試してください。
cannot use [5][2]string literal (type [5][2]string) as type [][]string in field value
私は私がGoはスライスで言っていると思うものに配列を代入しようとします。