根据golang faq的说法

在幕后,接口被实现为两个元素,一个类型和一个值。该值称为接口的动态值,是一个任意的具体值,类型是该值的类型。对于int值3,接口值示意性地包含( int,3)。

仅当内部值和类型都未设置时,接口值才为nil (nil,nil)。具体地说,nil接口将始终保持nil类型。如果我们在接口值中存储一个*int类型的nil指针,那么内部类型将是*int,而不管指针的值是什么:(*int,nil)。因此,即使内部指针为nil,这样的接口值也将为非nil。

a := (*interface{})(nil)var a *interface{} = nil
var b interface{} = (*interface{})(nil)binterface{}nilinterface{}nil*interface{}nil