Mengapakah membandingkan kepingan nol kepada antara muka{} menghasilkan hasil yang berbeza daripada membandingkan secara terus kepingan nol kepada nol?

Barbara Streisand
Lepaskan: 2024-11-05 05:59:02
asal
660 orang telah melayarinya

Why does comparing a nil slice to an interface{} result in a different outcome than directly comparing a nil slice to nil?

Melalukan Slice Nil ke Antara Muka: Membongkar Enigma

Dalam Go, perbezaan antara nilai hirisan nil dan antara muka nil{} boleh membawa kepada hasil yang tidak dijangka. Pertimbangkan petikan taman permainan berikut:

<code class="go">package main

import "fmt"

func main() {
    var i []int = nil
    yes(i) // true
    no(i)  // false
}

func yes(thing []int) {
    fmt.Println(thing == nil)
}

func no(thing interface{}) {
    fmt.Println(thing == nil)
}</code>
Salin selepas log masuk

Mengapakah fungsi ini menghasilkan output yang berbeza?

Memahami Antara Muka{}

Antara muka{} pembolehubah menyerupai struct dengan dua medan: jenis dan data. Dalam kes ini, ia kelihatan seperti {[]int (type), nil (data)}.

Nil Slice vs. Nil Interface

Dalam ya, nol hirisan dilalui terus. Perbandingan menyemak sama ada nil sama dengan nil, yang dinilai kepada benar.

Dalam tidak, hirisan nil dibalut dalam antara muka{}, menghasilkan {[]int (type), nil (data)}. Membandingkan antara muka ini dengan semakan sifar sama ada jenisnya adalah sifar, yang tidak berlaku. Oleh itu, output adalah palsu.

Sebab Perbezaan

Tingkah laku ini berpunca daripada fakta bahawa antara muka merangkumi kedua-dua jenis dan nilai. Membandingkan antara muka dengan semakan sifar untuk jenis sifar, manakala membandingkan nilai data asas adalah berbeza. Dalam kes tidak, jenisnya bukan nil, jadi perbandingan kembali palsu.

Kesimpulan

Tingkah laku yang kelihatan paradoks adalah disebabkan oleh perbezaan halus antara kepingan nil dan antara muka tiada. Memahami perbezaan ini adalah penting untuk mengelakkan kekeliruan apabila bekerja dengan antara muka dalam Go.

Atas ialah kandungan terperinci Mengapakah membandingkan kepingan nol kepada antara muka{} menghasilkan hasil yang berbeza daripada membandingkan secara terus kepingan nol kepada nol?. 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