【问题标题】:Null vs nil in golang?golang中的null vs nil?
【发布时间】:2016-02-16 21:56:41
【问题描述】:

我今天遇到了一个奇怪的错误。我有一个功能:

func Foo(s *someStruct) {
    fmt.Printf("s is %v\n", s)
    if s!=nil {
        fmt.Printf("s is not nil")
        ...
    }
}

我会这样调用函数:

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,但这是我通常得到的。在 Go 的这种情况下,null 和 nil 有什么区别?如何检查某些内容是 null 还是 nil 以正确执行代码?

【问题讨论】:

标签: pointers go interface null


【解决方案1】:

接口值包含对类型和值的引用。在以下代码中:

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

【讨论】:

  • 我不明白明确的词 null 来自哪里。它根本不是 Go 的构造。
  • 我得到了这个区别,可以扩展它来解释 Printf 的行为但是,我不认为这是回答问题,所以我建议详细说明。
  • @evanmcdonnal 我试图为此编写一个简短的操场,但没有得到null 作为输出。
  • @Not_a_Golfer:“null”不应该来自 fmt 包。它可能是自定义类型,术语稍有不正确,例如 play.golang.org/p/CRFKJxEkGE
  • @evanmcdonnal 我按照您的建议详细说明了答案。我假设有问题的“null”是一个错字,应该阅读评论中指出的“”。如果打印了“null”,那么 someStruct 有一个 String() string 方法或 fmt 包使用的其他一些自定义。
猜你喜欢
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-29
  • 1970-01-01
  • 2017-11-02
  • 2014-07-25
  • 2010-10-08
相关资源
最近更新 更多