Rumah > Artikel > pembangunan bahagian belakang > Mengapakah membandingkan kepingan nol kepada antara muka{} menghasilkan hasil yang berbeza daripada membandingkan secara terus kepingan nol kepada nol?
Melalukan Slice Nil ke Antara Muka: Membongkar Enigma
Dalam Go, perbezaan antara nilai hirisan nil dan antara muka nil{} boleh membawa kepada hasil yang tidak dijangka. Pertimbangkan petikan taman permainan berikut:
<code class="go">package main import "fmt" func main() { var i []int = nil yes(i) // true no(i) // false } func yes(thing []int) { fmt.Println(thing == nil) } func no(thing interface{}) { fmt.Println(thing == nil) }</code>
Mengapakah fungsi ini menghasilkan output yang berbeza?
Memahami Antara Muka{}
Antara muka{} pembolehubah menyerupai struct dengan dua medan: jenis dan data. Dalam kes ini, ia kelihatan seperti {[]int (type), nil (data)}.
Nil Slice vs. Nil Interface
Dalam ya, nol hirisan dilalui terus. Perbandingan menyemak sama ada nil sama dengan nil, yang dinilai kepada benar.
Dalam tidak, hirisan nil dibalut dalam antara muka{}, menghasilkan {[]int (type), nil (data)}. Membandingkan antara muka ini dengan semakan sifar sama ada jenisnya adalah sifar, yang tidak berlaku. Oleh itu, output adalah palsu.
Sebab Perbezaan
Tingkah laku ini berpunca daripada fakta bahawa antara muka merangkumi kedua-dua jenis dan nilai. Membandingkan antara muka dengan semakan sifar untuk jenis sifar, manakala membandingkan nilai data asas adalah berbeza. Dalam kes tidak, jenisnya bukan nil, jadi perbandingan kembali palsu.
Kesimpulan
Tingkah laku yang kelihatan paradoks adalah disebabkan oleh perbezaan halus antara kepingan nil dan antara muka tiada. Memahami perbezaan ini adalah penting untuk mengelakkan kekeliruan apabila bekerja dengan antara muka dalam Go.
Atas ialah kandungan terperinci Mengapakah membandingkan kepingan nol kepada antara muka{} menghasilkan hasil yang berbeza daripada membandingkan secara terus kepingan nol kepada nol?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!