, yaptığın "doğru" yoludur; çünkü dilimler her zaman tek boyutludur, ancak yüksek boyutlu nesneler oluşturmak için oluşturulabilir. Daha fazla bilgi için bu soruya bakın: Go: How is two dimensional array's memory representation. örneğin,
a := make([][]uint8, dy)
for i := range a {
a[i] = make([]uint8, dx)
}
Ayrıca bir composite literal ile dilim başlatmak eğer, "ücretsiz" için bu olsun unutmayın: Eğer buna kolaylaştırabilirsiniz
bir şey for range
yapısını kullanmaktır
a := [][]uint8{
{0, 1, 2, 3},
{4, 5, 6, 7},
}
fmt.Println(a) // Output is [[0 1 2 3] [4 5 6 7]]
Evet, bu, tüm öğeleri sıralamak zorunda gibi görünen sınırları var; ama bazı hileler vardır, yani tüm değerleri numaralandırmak zorunda değilsiniz, sadece dilim öğesinin türünde zero values olmayanlar. Bununla ilgili daha fazla bilgi için, bkz. Keyed items in golang array initialization.
ilk 10 element sıfırlar olan bir dilim istiyorum, ve sonra
1
ve
2
aşağıdaki Örneğin
, böyle oluşturulabilir:
b := []uint{10: 1, 2}
fmt.Println(b) // Prints [0 0 0 0 0 0 0 0 0 0 1 2]
Ayrıca not yerine arrays kullanmayı tercih ederseniz o slices nedeniyle, çok kolay oluşturulabilir:
c := [5][5]uint8{}
fmt.Println(c)
Çıktı geçerli:
[[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]]
Dizilerde "dış" dizisi üzerinde yineleme yapmak ve "iç" dizileri başlatmak zorunda kalmazsınız, diziler tanımlayıcılar değil, değerlerdir. Daha fazla bilgi için blog gönderisi Arrays, slices (and strings): The mechanics of 'append''a bakın.
Go Playground'daki örnekleri deneyin. Bir 2D dizinin satırlarını takas için bu fonksiyonu yazdım
'range' yanında ben OP ne sordu farkını ve örnek kodu görmek için başarısız. – eduncan911