Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Membandingkan Slice Nil kepada `nil` Berbeza Antara Jenis Konkrit dan Antara Muka dalam Go?

Mengapa Membandingkan Slice Nil kepada `nil` Berbeza Antara Jenis Konkrit dan Antara Muka dalam Go?

Barbara Streisand
Barbara Streisandasal
2024-11-03 08:45:03306semak imbas

Why Does Comparing a Nil Slice to `nil` Differ Between Concrete Types and Interfaces in Go?

Jenis antara muka dan hirisan nihil

Dalam Go, apabila menghantar pembolehubah kepada fungsi yang menjangkakan jenis antara muka, tingkah laku mungkin berbeza berdasarkan sama ada pembolehubah adalah sekeping atau tidak.

Pertimbangkan coretan 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>

Dalam atur cara ini, fungsi ya menjangkakan sekeping integer, manakala fungsi tidak menjangkakan antara muka taip. Apabila kita memanggil ya dengan kepingan nil i, output adalah benar kerana kepingan itu sendiri adalah nil. Walau bagaimanapun, panggilan tidak dengan kepingan nil menghasilkan palsu.

Untuk memahami sebab ini berlaku, kita perlu menyelidiki pelaksanaan antara muka dalam Go. Secara dalaman, jenis antara muka diwakili sebagai struct yang mengandungi dua medan: Itab, yang merujuk kepada deskriptor jenis dan Data, yang memegang nilai sebenar.

Apabila menghantar kepingan nol kepada ya, hanya nilai nol diluluskan sebagai Data, dan perbandingan berkesan menjadi nil == nil, yang benar. Walau bagaimanapun, apabila menghantar kepingan nol kepada tidak, Go membungkusnya secara automatik dalam jenis antara muka, menghasilkan sesuatu seperti tidak(antara muka{[]int, nil}). Dalam kes ini, perbandingan menjadi antara muka{[]int, nil} == nil, yang mengembalikan palsu kerana jenis antara muka itu sendiri bukan nol, walaupun data asasnya adalah nol.

Tingkah laku ini boleh dikaitkan kepada sifat antara muka dan cara ia berinteraksi dengan nilai nol. Seperti yang dijelaskan oleh Soalan Lazim Go, antara muka sifar dan nilai konkrit sifar ialah konsep yang berbeza. Apabila jenis antara muka memegang nilai sifar, ini tidak bermakna antara muka itu sendiri adalah sifar. Oleh itu, membandingkan jenis antara muka yang mengandungi nilai sifar kepada sifar akan menghasilkan palsu.

Atas ialah kandungan terperinci Mengapa Membandingkan Slice Nil kepada `nil` Berbeza Antara Jenis Konkrit dan Antara Muka dalam Go?. 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