我今天碰到了一个奇怪的虫子。我有一个功能:
var s *someStruct
Foo(s)
我会把这个函数称为:
func Foo(s someStructInterface) {
fmt.Printf("s is %v\n", s)
if s!=nil {
fmt.Printf("s is not nil")
...
}
}
然后我决定将结构转换为界面:
s is null
s is not nil
这给了我一个奇怪的输出:
s is nil
虽然我希望得到getTotalVisitors
,这是我通常会得到的。在Go中的这个场景中null和nil有什么区别?如何检查某些内容是null还是nil以正确执行代码?
答案 0 :(得分:3)
接口值包含对类型和值的引用。在以下代码中:
var s *someStruct
Foo(s)
传递给Foo的接口值包含对类型*someStruct
的引用和nil。
声明fmt.Printf("s is %v\n", s)
输出s is <nil>
,原因如下:
%v
格式使用类型的默认格式打印值。值s
包含指针类型。指针类型的默认格式为%p
。 %p
格式将nil指针打印为<nil>
。
表达式s != nil
的计算结果为true,因为当且仅当类型引用为nil时,接口值等于nil。在这种情况下,接口值引用类型*someStruct
。