gpt4 book ai didi

go - 作为接口(interface)传递的零 slice 不是零!为什么? (戈朗)

转载 作者:IT老高 更新时间:2023-10-28 13:10:12 25 4
gpt4 key购买 nike

查看这个 Playground :http://play.golang.org/p/nWHmlw1W01

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)
}

为什么两个函数的输出不同?

最佳答案

诚然,这有点怪癖,但有一个解释。

interface{} 变量想象为由两个字段组成的结构:一个是类型,另一个是数据。 ([]intnil)。实际上,它看起来就像在 Go 运行时中一样。

struct Iface                                                                                                                   
{
Itab* tab;
void* data;
};

当您将 nil slice 传递给 yes 时,只有 nil 作为值传递,因此您的比较归结为 nil == nil

同时,调用 no 会自动将您的变量包装在 interface{} 类型中,并且调用类似于 no(interface{[]int, nil })。所以 no 中的比较可以看成 interface{[]int, nil} == nil,结果在 go 中为 false。

这个问题实际上在 the Go FAQ 中有解释。 .

关于go - 作为接口(interface)传递的零 slice 不是零!为什么? (戈朗),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21460787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com