Memahami Sifar Slice Paradox dalam Antara Muka Go
Apabila menghantar hirisan sifar sebagai antara muka, mengapakah hasilnya tidak sifar? Tingkah laku yang membingungkan ini boleh dijelaskan dengan memahami pelaksanaan asas antara muka Go.
Dalam Go, pembolehubah antara muka{} pada asasnya ialah struktur dwi-medan, terdiri daripada deskriptor jenis dan nilai data, seperti yang digambarkan oleh Iface struct:
struct Iface { Itab* tab; void* data; };
Sekarang, mari analisa kedua-dua panggilan fungsi dalam kod yang disediakan:
<code class="go">yes([]int{}) // output: true no([]int{}) // output: false</code>
yes Fungsi:
In fungsi ya, nilai []int{} diluluskan sebagai perkara parameter. Memandangkan ya hanya menerima parameter hirisan, pengkompil menganggap nil sebagai hirisan nilai sifar. Oleh itu, perkara perbandingan == nil menjadi nil == nil, yang kembali benar.
tiada Fungsi:
Sebaliknya, no fungsi mengharapkan antara muka{} parameter. Apabila anda menghantar nilai []int{}, Go secara automatik membalutnya dalam jenis antara muka{}. dengan berkesan menukarnya kepada antara muka{[]int, nil}. Perkara perbandingan == nil kini menilai kepada antara muka{[]int, nil} == nil, yang menghasilkan palsu.
Tingkah laku ini diperjelaskan lagi dalam Soalan Lazim Go, yang menerangkan bahawa "antara muka yang mengandungi nil hanyalah sama dengan nol jika semua ahli mereka adalah nol" (iaitu dalam kes contoh ini, []int (ahli jenis) tidak boleh menjadi nil).
Oleh itu, apabila berurusan dengan kepingan nil dalam antara muka, ia adalah penting untuk mengetahui sifat aneh ini dan mempertimbangkan pelaksanaan asas untuk mentafsir tingkah laku dengan betul.
Atas ialah kandungan terperinci Mengapa Slice Nil Dilalui ke Antara Muka dalam Tidak Sama Nil?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!