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

mdw*_*ott 9 null go

看到这个游乐场: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)
}
Run Code Online (Sandbox Code Playgroud)

为什么两个函数之间的输出差异?

jus*_*nas 14

不可否认,这有些怪癖,但有一个解释.

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

struct Iface                                                                                                                   
{                                                                                                                              
    Itab*   tab;                                                                                                               
    void*   data;                                                                                                              
};   
Run Code Online (Sandbox Code Playgroud)

当您将nil切片传递给时yes,只会nil将其作为值传递,因此您的比较可归结为nil == nil.

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

问题实际上在Go FAQ中有解释.

  • Txg golang ...大量使用接口编写程序是一场噩梦 (2认同)