Rumah >pembangunan bahagian belakang >Golang >Mengapa Tatasusunan Struktur Kosong dalam Adakalanya Dibandingkan sebagai Sama Walaupun Penunjuknya Berbeza?

Mengapa Tatasusunan Struktur Kosong dalam Adakalanya Dibandingkan sebagai Sama Walaupun Penunjuknya Berbeza?

Susan Sarandon
Susan Sarandonasal
2024-12-24 01:50:19312semak imbas

Why Do Arrays of Empty Structs in Go Sometimes Compare as Equal Despite Their Pointers Being Different?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn