Nie ma bardziej zwięzłego sposobu, to, co zrobiłeś, jest „właściwą” drogą; ponieważ plasterki są zawsze jednowymiarowe, ale mogą być składane w celu konstruowania obiektów o wyższych wymiarach. Zobacz to pytanie po więcej szczegółów: Idź: Jak jest reprezentacja pamięci w dwuwymiarowej tablicy .
Jedną rzeczą, którą możesz uprościć, jest użycie for range
konstrukcji:
a := make([][]uint8, dy)
for i := range a {
a[i] = make([]uint8, dx)
}
Zwróć też uwagę, że jeśli zainicjujesz swój plasterek literałem złożonym , otrzymasz to za darmo, na przykład:
a := [][]uint8{
{0, 1, 2, 3},
{4, 5, 6, 7},
}
fmt.Println(a)
Tak, to ma swoje ograniczenia, ponieważ pozornie musisz wymienić wszystkie elementy; ale są pewne sztuczki, mianowicie nie musisz wyliczać wszystkich wartości, tylko te, które nie są zerowymi wartościami typu elementu wycinka. Aby uzyskać więcej informacji na ten temat, zobacz Keyed items in golang array initialization .
Na przykład, jeśli chcesz plasterek, w którym pierwsze 10 elementów to zera, a następnie następuje 1
i 2
, można go utworzyć w następujący sposób:
b := []uint{10: 1, 2}
fmt.Println(b)
Pamiętaj również, że jeśli zamiast plasterków użyjesz tablic , możesz je bardzo łatwo utworzyć:
c := [5][5]uint8{}
fmt.Println(c)
Wynik to:
[[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]]
W przypadku tablic nie musisz iterować po tablicy „zewnętrznej” i inicjować tablic „wewnętrznych”, ponieważ tablice nie są deskryptorami, ale wartościami. Zobacz wpis na blogu Tablice, plasterki (i ciągi): Mechanika „dołączania”, aby uzyskać więcej informacji.
Wypróbuj przykłady w Go Playground .
cannot use [5][2]string literal (type [5][2]string) as type [][]string in field value
kiedy próbuję przypisać tablicę do tego, co, jak sądzę, mówię, że Go to kawałek.