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

前端之家收集整理的这篇文章主要介绍了nil slice作为接口传递时不是零!为什么? (golang)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
看到这个游乐场: 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中解释的.

猜你在找的Go相关文章