Rumah >pembangunan bahagian belakang >Golang >Mengapakah Perbandingan Tatasusunan Struktur Kosong dalam Pergi Kadangkala Menghasilkan Keputusan yang Tidak Dijangka?
Mengapa Tatasusunan Perbandingan Struktur Menghasilkan Hasil Tidak Sama
Dalam Go, membandingkan tatasusunan struktur kosong boleh menghasilkan hasil yang tidak dijangka. Tingkah laku ini berpunca daripada sifat halus penunjuk dan pembolehubah saiz sifar dalam bahasa.
Petunjuk kepada Pembolehubah Saiz Sifar
Mengikut spesifikasi Go, penunjuk kepada pembolehubah saiz sifar yang berbeza tidak semestinya mempunyai alamat yang unik. Ini kerana pembolehubah bersaiz sifar mungkin dioptimumkan oleh pengkompil, yang membawa kepada peruntukan memori yang tidak dapat diramalkan.
Contoh
Pertimbangkan kod berikut:
var s, ss struct{} // two empty structs arr1 := [6]*struct{}{&s} // array with empty struct pointer arr2 := [6]*struct{}{&ss} // array with empty struct pointer fmt.Println(&s == &ss, arr1 == arr2) // false, true
Dalam contoh ini, arr1 dan arr2 ialah dua tatasusunan yang mengandungi penunjuk kepada struktur kosong yang berbeza, s dan ss. Yang menghairankan, perbandingan arr1 == arr2 kembali benar. Ini kerana pengkompil mungkin telah meletakkan s dan ss pada alamat yang sama, walaupun identitinya berbeza. Walau bagaimanapun, &s == &ss menilai kepada palsu kerana ia membandingkan secara langsung penunjuk itu sendiri.
Pembolehubah Int dalam Struktur
Walau bagaimanapun, apabila nilai bukan sifar disimpan dalam struktur, seperti integer, tingkah laku perbandingan berubah.
var l, ll struct{A int}{} arr3 := [6]*struct{A int}{&l} // array with empty struct pointer arr4 := [6]*struct{A int}{&ll} // array with empty struct pointer fmt.Println(&l == &ll, arr3 == arr4) // false, false
Dalam kes ini, perbandingan arr3 dan arr4 mengembalikan palsu, menunjukkan bahawa tatasusunan tidak sama. Ini kerana integer bukan sifar yang disimpan dalam struktur memberi mereka alamat yang berbeza.
Analisis Melarikan Diri dan Penempatan Semula Pembolehubah
Tingkah laku yang tidak dijangka juga boleh dipengaruhi oleh analisis melarikan diri , pengoptimuman pengkompil yang menentukan sama ada pembolehubah perlu diperuntukkan pada timbunan atau timbunan. Jika pembolehubah terlepas daripada skop setempatnya, ia diperuntukkan pada timbunan untuk memastikan kebolehaksesannya di bahagian lain program.
Dalam kes penunjuk kepada struktur kosong, jika ia terlepas, pengkompil boleh memindahkannya ke alamat timbunan yang berbeza. Penempatan semula ini menjejaskan perbandingan kesaksamaan mereka, mengakibatkan palsu.
Atas ialah kandungan terperinci Mengapakah Perbandingan Tatasusunan Struktur Kosong dalam Pergi Kadangkala Menghasilkan Keputusan yang Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!