Teka-teki Perbandingan Antara Muka Nihil
Walaupun memenuhi antara muka ralat, struct dengan contoh nil tidak berfungsi seperti yang diharapkan jika dibandingkan dengan tiada.
Soalan:
Mengapa kod berikut tidak mengeluarkan "Ralat tiada"?
<code class="go">type Goof struct {} func (goof *Goof) Error() string { return fmt.Sprintf("I'm a goof") } func TestError(err error) { if err == nil { fmt.Println("Error is nil") } else { fmt.Println("Error is not nil") } } func main() { var g *Goof // nil TestError(g) // expect "Error is not nil" }</code>
Jawapan:
Dalam Go, perbandingan antara muka mempertimbangkan kedua-dua jenis dan nilai. Walaupun jenis Goof melaksanakan antara muka ralat, contoh nil Goof (*Goof)(nil) mempunyai jenis yang berbeza daripada error(nil).
Penyelesaian:
Untuk menangani perkara ini, anda boleh menggunakan salah satu pendekatan berikut:
Untuk butiran lanjut, rujuk maklum balas lanjutan di bawah:
Maklum Balas Lanjutan:
Nilai antara muka terdiri daripada dua komponen: jenis dan nilai dinamik. Nilai antara muka nihil mengandungi kedua-dua jenis nihil dan nilai nihil. Dalam kes kami, (*Goof)(nil) mempunyai jenis bukannil (Goof), tetapi nilai nil.
Selain itu, pengendali kesamarataan Go (==) menyemak dengan ketat untuk mengenal pasti jenis identiti. Oleh itu, membandingkan (*Goof)(nil) dengan ralat(nil) gagal kerana ia adalah daripada jenis yang berbeza.
Tingkah laku ini konsisten dengan semakan jenis lain dalam Go. Sebagai contoh, dalam kod berikut, data asas adalah sama (3), tetapi pembolehubah mempunyai jenis yang berbeza, mengakibatkan ketidaksamaan apabila disimpan dalam antara muka:
<code class="go">var x int = 3 var y Bob = 3 var ix, iy interface{} = x, y fmt.Println(ix == iy) // false</code>
Atas ialah kandungan terperinci Mengapakah contoh nil bagi struct yang memenuhi antara muka ralat tidak dibandingkan dengan nil?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!