Tidak ada cara yang lebih ringkas, apa yang Anda lakukan adalah cara yang "benar"; karena irisan selalu satu dimensi tetapi dapat disusun untuk membangun objek berdimensi lebih tinggi. Lihat pertanyaan ini untuk lebih jelasnya: Pergi: Bagaimana representasi memori array dua dimensi .
Satu hal yang dapat Anda sederhanakan adalah dengan menggunakan for range
konstruksi:
a := make([][]uint8, dy)
for i := range a {
a[i] = make([]uint8, dx)
}
Perhatikan juga bahwa jika Anda menginisialisasi potongan Anda dengan literal komposit , Anda mendapatkan ini secara "gratis", misalnya:
a := [][]uint8{
{0, 1, 2, 3},
{4, 5, 6, 7},
}
fmt.Println(a) // Output is [[0 1 2 3] [4 5 6 7]]
Ya, ini ada batasnya karena Anda harus menghitung semua elemen; tetapi ada beberapa trik, yaitu Anda tidak harus menghitung semua nilai, hanya nilai yang bukan nilai nol dari jenis elemen potongan. Untuk detail selengkapnya tentang ini, lihat Item yang dimasukkan dalam inisialisasi larik golang .
Misalnya jika Anda menginginkan potongan di mana 10 elemen pertama adalah nol, lalu mengikuti 1
dan 2
, itu bisa dibuat seperti ini:
b := []uint{10: 1, 2}
fmt.Println(b) // Prints [0 0 0 0 0 0 0 0 0 0 1 2]
Perhatikan juga bahwa jika Anda menggunakan array, bukan irisan , ini dapat dibuat dengan sangat mudah:
c := [5][5]uint8{}
fmt.Println(c)
Outputnya adalah:
[[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]]
Dalam kasus array, Anda tidak perlu mengulang array "luar" dan menginisialisasi array "dalam", karena array bukanlah deskriptor tetapi nilai. Lihat entri blog Array, irisan (dan string): Mekanisme 'tambahkan' untuk detail selengkapnya.
Coba contoh di Go Playground .
cannot use [5][2]string literal (type [5][2]string) as type [][]string in field value
ketika saya mencoba untuk menetapkan array ke apa yang saya kira saya katakan Go is a slice.