Rumah >pembangunan bahagian belakang >Golang >Mengapa Slice Nil Berkelakuan Berbeza Apabila Dihantar ke Antara Muka dalam Go?

Mengapa Slice Nil Berkelakuan Berbeza Apabila Dihantar ke Antara Muka dalam Go?

Susan Sarandon
Susan Sarandonasal
2024-11-03 05:32:02301semak imbas

Why Does a Nil Slice Behave Differently When Passed to an Interface in Go?

Gelagat Pelik Slices Nil dalam Antara Muka Go

Dalam Go, hirisan boleh diberikan nilai nol, yang menandakan kepingan kosong. Walau bagaimanapun, apabila hirisan nol dihantar sebagai hujah kepada fungsi yang mengharapkan antara muka{}, perbezaan yang mengejutkan dalam tingkah laku muncul.

Pertimbangkan taman permainan Go 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 contoh di atas, dua fungsi, ya dan tidak, menerima kepingan nil yang sama seperti hujahnya. Walau bagaimanapun, output kedua-dua fungsi berbeza. ya cetakan benar, menunjukkan bahawa kepingan itu memang tiada. tidak, sebaliknya, mencetak palsu.

Mengapa terdapat percanggahan ini? Jawapannya terletak pada cara hirisan nil diwakili secara dalaman dalam antara muka Go.

Pembolehubah antara muka{}, yang digunakan untuk mewakili pelbagai jenis, terdiri daripada dua medan: jenis dan penuding data. Apabila kepingan nil dihantar kepada fungsi yang mengharapkan antara muka{}, ia dibalut dalam jenis antara muka{} dan penunjuk data ditetapkan kepada nil.

Dalam kes ya, ia membandingkan secara langsung hujah kepada nil, dengan berkesan bertanya sama ada hirisan itu sendiri adalah nil. Perbandingan ini kembali benar kerana kepingan itu memang kosong.

Walau bagaimanapun, fungsi tiada menerima kepingan nol yang dibalut dalam antara muka{}. Perbandingan dalam kes ini bukan sahaja antara kepingan dan nol tetapi antara keseluruhan antara muka{} dan nol. Di dalam masa jalan, perbandingan ini bermuara kepada menguji sama ada penuding data antara muka{} adalah sifar, yang palsu kerana pembungkus antara muka telah memperuntukkan memori untuknya.

Tingkah laku ini juga didokumenkan dalam Soalan Lazim Go:

"Masalah biasa dengan hirisan nil yang dihantar ke antara muka: memandangkan hirisan nil diwakili oleh nilai antara muka nil, menulis if i == nil mungkin berjaya secara palsu apabila menguji nilai antara muka i (antara muka nil adalah palsu)."

Atas ialah kandungan terperinci Mengapa Slice Nil Berkelakuan Berbeza Apabila Dihantar ke 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