Pointers 在golang,空对零?

Pointers 在golang,空对零?,pointers,go,interface,null,Pointers,Go,Interface,Null,我今天碰到一只奇怪的虫子。我有一个功能: 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

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

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

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

var s *someStruct
Foo(s)
传递给Foo的接口值包含对类型
*someStruct
的引用和nil

语句
fmt.Printf(“s是%v\n”,s)
输出
s是
,原因如下:
%v
格式使用类型的默认格式打印值。值
s
包含指针类型。指针类型的默认格式为
%p
%p
格式将零指针打印为


表达式
s!=nil
计算结果为true,因为当且仅当类型引用为nil时,接口值等于nil。在本例中,接口值引用类型
*someStruct

,我不明白显式单词
null
来自何处。这不是一个GO的构造。我得到了这个区别,可以扩展到解释<代码> Prtff<代码>的行为。然而,我不认为这是回答问题,所以我建议对此进行详细的阐述。“EvnMcDunNay.我试图为它编写一个短的游乐场,并且没有得到<代码> null <代码>作为输出。@ NothayaGoelFER:“NULL”不应该来自fmt包。这可能是一个自定义类型,术语有点不正确,比如@evanmcdonnal,我按照您的建议详细说明了答案。我假设所讨论的“null”是一个打字错误,应该如评论中所指出的那样读为“”。如果打印了“null”,则someStruct有一个
String()String
方法或fmt包使用的一些其他自定义项。的可能重复项。接口示例的输出为
s为
,而
s不是nil