Nil Slice vs. Nil Interface
Dalam Go, hirisan nol tidak sama dengan antara muka nil. Tingkah laku ini ditunjukkan dalam kod berikut:
<code class="go">package main import "fmt" func main() { var i []int = nil yes(i) // output: true no(i) // output: false } func yes(thing []int) { fmt.Println(thing == nil) } func no(thing interface{}) { fmt.Println(thing == nil) }</code>
Perbezaan dalam output antara kedua-dua fungsi adalah disebabkan oleh cara Go mengendalikan jenis antara muka.
Jenis Antaramuka
Jenis antara muka dalam Go ialah koleksi kaedah yang boleh dilaksanakan oleh jenis nilai tertentu. Apabila pembolehubah{} antara muka digunakan, ia boleh menyimpan sebarang nilai dari sebarang jenis yang melaksanakan antara muka.
Antara Muka Tiada
Apabila pembolehubah{} antara muka diberikan kepada sifar, medan data antara muka ditetapkan kepada sifar, tetapi medan jenis tidak. Akibatnya, antara muka nol tidak sama dengan nol.
Slice Nil
Sebaliknya, hirisan nil hanyalah hirisan tanpa unsur. Apabila anda membandingkan kepingan sifar dengan sifar, perbandingan itu dinilai kepada benar kerana kedua-dua medan data dan jenis kepingan ditetapkan kepada sifar.
Kesimpulan
Oleh itu, perbezaan dalam output antara dua fungsi dalam contoh kod adalah disebabkan oleh fakta bahawa nil([]int) ialah hirisan nil, manakala nil(antara muka{}) ialah antara muka nil. Potongan sifar dinilai kepada benar jika dibandingkan dengan sifar, manakala antara muka sifar dinilai kepada palsu.
Atas ialah kandungan terperinci Mengapakah `nil([]int)` Sama dengan `nil`, Tetapi `nil(antara muka{})` Tidak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!