Daha özlü bir yol yok, yaptığınız şey "doğru" yoldur; çünkü dilimler her zaman tek boyutludur ancak daha yüksek boyutlu nesneler oluşturmak için oluşturulabilir. Daha fazla ayrıntı için bu soruya bakın: Git: İki boyutlu dizinin bellek temsili nasıldır .
Bunu basitleştirebileceğiniz bir şey, for range
yapıyı kullanmaktır :
a := make([][]uint8, dy)
for i := range a {
a[i] = make([]uint8, dx)
}
Ayrıca diliminizi bileşik bir değişmez değerle başlatırsanız , bunu "ücretsiz" olarak elde edeceğinizi unutmayın, örneğin:
a := [][]uint8{
{0, 1, 2, 3},
{4, 5, 6, 7},
}
fmt.Println(a)
Evet, görünüşe göre tüm unsurları numaralandırmanız gerektiğinden, bunun sınırları vardır; ancak bazı hileler var, yani tüm değerleri numaralandırmanız gerekmiyor, sadece dilimin eleman türünün sıfır değerleri olmayanlar . Bununla ilgili daha fazla ayrıntı için bkz . Golang dizisi başlatmada anahtarlı öğeler .
Örneğin ilk 10 element sıfırlar, ve sonra aşağıda bir dilim istiyorsanız 1
ve 2
böyle oluşturulabilir:
b := []uint{10: 1, 2}
fmt.Println(b)
Ayrıca dilimler yerine diziler kullanırsanız, çok kolay bir şekilde oluşturulabileceğini unutmayın:
c := [5][5]uint8{}
fmt.Println(c)
Çıktı:
[[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]]
Diziler söz konusu olduğunda, "dış" diziyi yinelemeniz ve "iç" dizileri başlatmanız gerekmez, çünkü diziler tanımlayıcı değil değerdir. Blog gönderisine bakın Diziler, dilimler (ve dizeler): 'ekleme'nin mekaniği fazla ayrıntı için .
Go Playground'daki örnekleri deneyin .
cannot use [5][2]string literal (type [5][2]string) as type [][]string in field value
ben Git söylüyorum bir dilim olduğunu tahmin ne dizisi atamak çalıştığınızda.