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
。