看到这个游乐场:
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中解释的.