を、あなたがやったことは「正しい」方法です。スライスは常に1次元であるが、より高次元のオブジェクトを構成するように構成されている可能性があるからである。詳細については、この質問を参照してください:Go: How is two dimensional array's memory representation。例えば、
a := make([][]uint8, dy)
for i := range a {
a[i] = make([]uint8, dx)
}
はまた、あなたがcomposite literalとあなたのスライスを初期化した場合、あなたは「無料」のためにこれを取得することに注意してください:あなたはそれを簡素化することができ
ことの一つは、for range
構文を使用することです
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の例をお試しください。私は2次元配列の行を交換するために、この機能を書いた
は 'range'のほかに、私はOPが尋ねたものの違いや、あなたのコード例を参照してくださいに失敗します。 – eduncan911