Rumah > Artikel > pembangunan bahagian belakang > Mengapakah membandingkan antara muka nol dengan `nil` gagal dalam Go?
Antaramuka dan Perbandingan Jenis dalam Go
Dalam Go, antara muka menyediakan cara untuk mentakrifkan set kaedah biasa yang boleh dilaksanakan oleh pelbagai jenis. Walau bagaimanapun, adalah penting untuk memahami cara perbandingan antara muka berfungsi untuk mengelakkan tingkah laku yang tidak dijangka.
Pertimbangkan kod berikut:
<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 nil" }</code>
Dalam contoh ini, kami mencipta Goof jenis tersuai yang melaksanakan antara muka ralat . Kami kemudian menghantar penunjuk nol jenis *Goof ke fungsi TestError yang menjangkakan ralat. Secara berlawanan, atur cara tidak mencetak "Ralat bukan nol."
Ini kerana perbandingan antara muka bukan sahaja menyemak nilai tetapi juga jenisnya. Dalam kes ini, contoh tiada *Goof adalah daripada jenis yang berbeza daripada antara muka ralat. Oleh itu, perbandingan err == nil gagal.
Untuk mengatasi isu ini, terdapat beberapa pilihan. Salah satunya ialah mengisytiharkan ralat sebagai pembolehubah jenis ralat secara langsung:
<code class="go">var err error = g</code>
Pilihan lain ialah mengembalikan sifar daripada fungsi anda jika ralat berlaku:
<code class="go">func MyFunction() error { // ... if errorOccurred { return nil } // ... }</code>
Dengan memahami cara perbandingan antara muka bekerja, anda boleh mengelakkan kemungkinan perangkap dan menulis kod Go yang lebih berkesan.
Atas ialah kandungan terperinci Mengapakah membandingkan antara muka nol dengan `nil` gagal dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!