golang中的Null vs nil?

时间:2016-02-16 21:56:41

标签: pointers go interface null

我今天碰到了一个奇怪的虫子。我有一个功能:

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以正确执行代码?

1 个答案:

答案 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