诚然,这有点古怪,但是有一个解释。
想象一个
interface{}变量是由两个字段组成的结构:一个是类型,另一个是数据。([]int和
nil)。实际上,它看起来就像Go运行时中的样子。
struct Iface { Itab* tab; void* data;};当您将nil slice传递给时
yes,只会
nil将其作为值传递,因此您的比较可简化为
nil == nil。
同时,调用会
no自动将您的变量包装为一种
interface{}类型,并且调用变得类似于no(interface{[]int,nil})。因此,in中的比较no可以看成
interface{[]int, nil} == nil,这在进行中被证明是错误的。该问题实际上在Go
FAQ中得到了解释。



