Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah contoh nil bagi struct yang memenuhi antara muka ralat tidak dibandingkan dengan nil?

Mengapakah contoh nil bagi struct yang memenuhi antara muka ralat tidak dibandingkan dengan nil?

Susan Sarandon
Susan Sarandonasal
2024-10-31 07:50:30839semak imbas

Why does a nil instance of a struct that satisfies the error interface not compare equal to nil?

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:

  • Isytihar ralat ralat bukannya var g *Goof. Ini memulakan ralat kepada nilai sifar jenis ralat, iaitu nil.
  • Dalam fungsi mengembalikan ralat, kembalikan nil secara eksplisit dan bukannya meninggalkannya secara tersirat.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn