加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

nil slice作为接口传递时不是零!为什么? (golang)

发布时间:2020-12-16 19:19:35 所属栏目:大数据 来源:网络整理
导读:看到这个游乐场: http://play.golang.org/p/nWHmlw1W01 package mainimport "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.P
看到这个游乐场: 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 {}变量作为由两个字段组成的结构:一个是类型,另一个是数据. ([] int和nil).实际上,它在Go运行时看起来就像那样.

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

当你将nil切片传递给yes时,只有nil作为值传递,所以你的比较可以归结为nil == nil.

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

这个问题实际上是在the Go FAQ中解释的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读