Es gibt keinen prägnanteren Weg, was Sie getan haben, ist der "richtige" Weg; weil Scheiben immer eindimensional sind, aber zusammengesetzt werden können, um höherdimensionale Objekte zu konstruieren. Sehen Sie diese Frage für weitere Informationen: Go: Wie ist zwei Speicher Darstellung der dreidimensionalen Anordnung .
Eine Sache, die Sie vereinfachen können, ist die Verwendung des for range
Konstrukts:
a := make([][]uint8, dy)
for i := range a {
a[i] = make([]uint8, dx)
}
Beachten Sie auch, dass Sie, wenn Sie Ihr Slice mit einem zusammengesetzten Literal initialisieren , dieses kostenlos erhalten, zum Beispiel:
a := [][]uint8{
{0, 1, 2, 3},
{4, 5, 6, 7},
}
fmt.Println(a) // Output is [[0 1 2 3] [4 5 6 7]]
Ja, dies hat seine Grenzen, da Sie anscheinend alle Elemente aufzählen müssen. Es gibt jedoch einige Tricks, nämlich, dass Sie nicht alle Werte aufzählen müssen, sondern nur diejenigen, die nicht die Nullwerte des Elementtyps des Slice sind. Weitere Informationen hierzu finden Sie unter Schlüsselelemente in der Initialisierung des Golang-Arrays .
Wenn Sie beispielsweise ein Slice möchten, in dem die ersten 10 Elemente Nullen sind, und dann folgt 1
und 2
, kann es wie folgt erstellt werden:
b := []uint{10: 1, 2}
fmt.Println(b) // Prints [0 0 0 0 0 0 0 0 0 0 1 2]
Beachten Sie auch, dass Arrays anstelle von Slices sehr einfach erstellt werden können:
c := [5][5]uint8{}
fmt.Println(c)
Ausgabe ist:
[[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]]
Bei Arrays müssen Sie nicht über das "äußere" Array iterieren und "innere" Arrays initialisieren, da Arrays keine Deskriptoren, sondern Werte sind. Weitere Informationen finden Sie im Blog-Beitrag Arrays, Slices (und Strings): Die Mechanik des Anhängens .
Probieren Sie die Beispiele auf dem Go Playground aus .
cannot use [5][2]string literal (type [5][2]string) as type [][]string in field value
wenn ich versuche, das Array dem zuzuweisen, was ich denke, dass Go ein Slice ist.