看到这个游乐场: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{}变量作为由两个字段组成的结构:一个是类型,另一个是数据.([]int和nil).实际上,它在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中有解释.