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

Susan Sarandon
Lepaskan: 2024-11-03 05:32:02
asal
227 orang telah melayarinya

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>
Salin selepas log masuk

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!

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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!