Perbandingan Susunan Struktur Kosong: Memahami Gelagat Pembolehubah
Apabila membandingkan tatasusunan struct kosong dalam Go, anda mungkin menemui hasil yang tidak dijangka. Mari kita terokai tingkah laku ini melalui contoh kod dan fahami sebab ia berlaku.
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
Di sini, kami mentakrifkan struct kosong s dan ss, mulakan tatasusunan arr1 dan arr2 dengan penunjuk kepada struct ini, dan mencetak hasil perbandingan. Yang menghairankan, manakala &s dan &ss tidak sama, arr1 dan arr2 adalah sama.
Untuk memahami perkara ini, kita perlu merujuk kepada spesifikasi Go. Spesifikasi untuk nilai penunjuk menyatakan bahawa ia adalah sama jika ia menunjukkan kepada pembolehubah yang sama atau kedua-duanya mempunyai nilai sifar. Yang penting, ia menyatakan bahawa penunjuk kepada pembolehubah saiz sifar yang berbeza "mungkin sama atau mungkin tidak sama."
Selain itu, struct tanpa medan mempunyai saiz sifar. Oleh itu, &s dan &ss menunjuk kepada pembolehubah saiz sifar yang berbeza, dan perbandingan &s == &ss mungkin menilai sama ada benar atau salah.
Begitu juga, kelakuan perbandingan tatasusunan arr1 == arr2 tidak dijamin. Spesifikasi untuk pembolehubah saiz sifar menunjukkan bahawa mereka "mungkin" mempunyai alamat yang sama dalam ingatan. Oleh itu, arr1 dan arr2 mungkin sama atau tidak, dan hasilnya boleh berbeza-beza merentas larian program yang berbeza.
Untuk meringkaskan, membandingkan penunjuk kepada pembolehubah saiz sifar yang berbeza, seperti struct kosong, boleh menghasilkan yang tidak dapat diramalkan keputusan. Walaupun anda mungkin melihat hasil tertentu sekali, ia mungkin berbeza dalam larian berikutnya disebabkan oleh cara pengkompil mengoptimumkan peruntukan memori.
Atas ialah kandungan terperinci Mengapa Tatasusunan Struktur Kosong dalam Adakalanya Dibandingkan sebagai Sama Walaupun Penunjuknya Berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!