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?

WBOY
WBOYke hadapan
2024-02-08 23:10:101143semak imbas

Golang 中 `array` 和 `slice{array,array,...}` 有什么区别?

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.

Kandungan soalan

Saya ingin tahu sebabnya, sila beri saya petunjuk.

Saya ingin menambahkan tatasusunan pada res中,resiaitu 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 tentatif
for 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?

Penyelesaian

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam