Dalam bahasa Go, apabila hirisan dialihkan ke lokasi lain dalam ingatan, penunjuk kepada elemen berubah. Memandangkan kepingan ialah tatasusunan dinamik, struktur data asasnya mengandungi penunjuk kepada elemen tatasusunan serta maklumat panjang dan kapasiti kepingan itu. Apabila hirisan diagihkan semula atau dikembangkan, penunjuk elemen yang ditunjuknya pada asalnya tidak lagi sah. Oleh itu, jika penuding sebelumnya masih digunakan selepas kepingan dialihkan, ia boleh menyebabkan lokasi memori yang salah diakses atau pengecualian lain mungkin dilemparkan. Untuk mengelakkan ini, kita harus mendapatkan semula penunjuk kepada elemen selepas hirisan dialihkan untuk memastikan kesahihan dan ketepatan penunjuk. Dengan memperoleh semula penuding, kami boleh terus memanipulasi dan mengakses elemen dengan betul dalam hirisan selepas hirisan dialihkan.
Saya ada kod berikut
package main import "fmt" func main() { a := []int{1} b := &a[0] fmt.Println(a, &a[0], b, *b) // prints [1] 0xc00001c030 0xc00001c030 1 a = append(a, 1, 2, 3) fmt.Println(a, &a[0], b, *b) // prints [1 1 2 3] 0xc000100020 0xc00001c030 1 }
Mula-mula ia mencipta sekeping 1 int. Lennya ialah 1 dan penutupnya juga 1. Saya kemudian mendapatkan penunjuk kepada elemen pertamanya dan dalam cetakan mendapatkan nilai penunjuk asas. Seperti yang dijangka, ia berfungsi dengan baik.
Saya kemudian memanjangkan kapasiti hirisan dengan menambahkan 3 elemen padanya, sekali gus menyalinnya ke lokasi lain dalam ingatan. Selepas itu, saya mencetak alamat elemen pertama kepingan (dengan mendapatkan penunjuk), yang kini berbeza daripada alamat yang disimpan dalam b
.
Tetapi apabila saya mencetak nilai asas b
的基础值时,它也可以正常工作。我不明白为什么它有效。据我所知,第一个元素 b
ia juga berfungsi dengan baik. Saya tidak faham mengapa ia berfungsi. Setahu saya, hirisan yang ditunjuk oleh elemen pertama
Jika kita melihat pada peta, golang tidak membenarkan kita membuat penunjuk pada elemen mengikut kekunci kerana masalah yang sama - data asas boleh dialihkan ke lokasi lain dalam ingatan. Walau bagaimanapun, ia berfungsi dengan baik untuk menghiris. Mengapa ini berlaku? Bagaimana sebenarnya ia berfungsi? Adakah memori tidak dibebaskan kerana masih terdapat pembolehubah yang menunjuk kepadanya? Bagaimanakah ia berbeza daripada peta? PenyelesaianApakah yang berlaku kepada penuding kepada elemen apabila Go mengalihkan kepingan ke lokasi lain dalam ingatan?
Tiada apa-apa.
b
[W] Apabila saya mencetak nilai asas
Mengapa ia tidak berkesan?
b
Lokasi memori yang asalnya ditunjuk masih wujud, tidak berubah. Selagi apa-apa (mis.
Atas ialah kandungan terperinci Apakah yang berlaku kepada penuding kepada elemen apabila Go mengalihkan kepingan ke lokasi lain dalam ingatan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!