Mengapa Nilai Antara Muka `nil` Tidak Sama dengan `error(nil)` dalam Go?

Patricia Arquette
Lepaskan: 2024-10-30 18:45:30
asal
689 orang telah melayarinya

Why Does `nil` Interface Value Not Equal `error(nil)` in Go?

Perbandingan Kejadian Antara Muka Nil

Pertimbangkan kod di bawah:

<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) // Displays "Error is not nil"
}</code>
Salin selepas log masuk

Anehnya, kod ini menghasilkan " Ralat bukan nol", walaupun ada niat untuk menguji keadaan nol.

Kunci untuk memahami tingkah laku ini terletak pada cara Go melaksanakan antara muka. Secara dalaman, nilai antara muka terdiri daripada jenis dan nilai. Walaupun nilainya mungkin nol, jenisnya tidak pernah nil. Dalam contoh yang diberikan, (*Goof)(nil) ialah nilai antara muka dengan jenis "*Goof" dan nilai nol.

Walau bagaimanapun, jenis antara muka ralat adalah berbeza daripada jenis "*Goof". Oleh itu, (*Goof)(nil) dan ralat(nil) adalah tidak sama, walaupun kedua-duanya mengandungi nilai nol. Ini terbukti daripada kod berikut:

<code class="go">var g *Goof // nil
var e error = g

if e == nil {
    fmt.Println("Error is nil")
} else {
    fmt.Println("Error is not nil")
}
// Output: Error is not nil</code>
Salin selepas log masuk

Untuk menyelesaikan isu ini, terdapat pelbagai pendekatan:

  1. Isytihar ralat var err dan bukannya var g *Goof, sebagai sifar err value is conveniently error(nil).
  2. Jika fungsi mengembalikan ralat, menggunakan return nil akan mengembalikan nilai nil antara muka yang dikehendaki.

Atas ialah kandungan terperinci Mengapa Nilai Antara Muka `nil` Tidak Sama dengan `error(nil)` dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan