Rumah > Artikel > pembangunan bahagian belakang > Apakah perbezaan antara `array` dan `slice{array,array,...}` di Golang?
Apakah perbezaan antara `array` dan `slice{array,array,...}` di Golang? Ini adalah soalan yang sering ditanya oleh ramai pemula. Editor PHP Zimo akan menjawab untuk anda: Dalam Golang, `array` ialah urutan panjang tetap Setelah ditentukan, panjangnya tidak boleh diubah. `slice` ialah jujukan panjang dinamik yang boleh dikembangkan atau dikurangkan mengikut keperluan. Selain itu, panjang `tatasusunan` ditentukan pada masa takrifan, manakala panjang `slice` boleh ditukar secara dinamik semasa masa jalan. Oleh itu, apabila menggunakannya, anda perlu memilih struktur data yang sesuai berdasarkan keperluan sebenar.
Saya ingin tahu sebabnya, sila beri saya petunjuk.
Saya ingin menambahkan tatasusunan pada res
中,res
iaitu kepingan 2D. Jadi saya perlu menukar dahulu.
Apabila saya menukar tatasusunan kepada slice, saya mendapat ralat.
// i need a map to remove duplicates mm := map[[3]int]bool{} mm[[3]int{-1, -1, 2}] = true mm[[3]int{-1, -1, 2}] = true mm[[3]int{-1, 0, 1}] = true var res [][]int for k, _ := range mm { res = append(res, k[:]) } fmt.printf("the res is %v\n", res)
the res is [[-1 0 1] [-1 0 1]]
Tetapi hasilnya tidak seperti yang saya mahukan.
Kemudian saya mengubah suai gelung for
secara tentatiffor k, _ := range mm { //res = append(res, k[:]) res = append(res, []int{k[0], k[1], k[2]}) }
the res is [[-1 0 1] [-1 -1 2]]
Sekarang hasilnya betul, tetapi kenapa?
k[:]
和 []int{k[0],k[1],k[2]}
Apa bezanya?
Tukar gelung kepada
for k, _ := range mm { j := k res = append(res, j[:]) }
Gelung asal anda mengisytiharkan pembolehubah jenis [3]int
的变量 k
,该变量在内存中具有特定位置。循环的每次迭代,都会将映射 mm
di mana kunci berbeza disalin ke. Setakat ini, begitu baik.
Apabila anda menggunakan k[:]
将其转换为切片时,它会创建一个切片标头,指向数组 k
。这里出错了 - 循环的下一次迭代,k
的值被覆盖。循环中创建的所有切片都指向内存中同一位置的同一支持数组 k
.
Anda mengelakkan masalah dengan memberikan setiap hirisan tatasusunan sandaran sendiri dengan menyalin nilai k
dahulu kepada pembolehubah yang diisytiharkan di dalam gelung.
Atas ialah kandungan terperinci Apakah perbezaan antara `array` dan `slice{array,array,...}` di Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!