我尝试检查Golang何时返回本地值为nil,然后使用此代码。
package main import ( "fmt" ) type S struct{} func InitEfacePointer() interface{} { var s *S println(s) return s } func main() { s := InitEfacePointer() fmt.Println(s) //println(s) }
输出为0x0
但是当我只是使用println输出值时。
package main type S struct{} func InitEfacePointer() interface{} { var s *S println(s) return s } func main() { s := InitEfacePointer() println(s) }
输出更改为0x0(0x93d40,0x0)
谁能解释这种行为的机制?谢谢!
首先,fmt.Println内建println是非常不同的问题:在实现和目的上都不同。fmt.Println使用反射处理许多复杂的情况,而println仅处理一些基本情况,并且仅用于“引导或调试”(如规范所述)。
fmt.Println
println
在这种情况下,您将打印interface{}从返回的InitEfacePointer()。在fmt.Println外观到使用界面反映和获取基础数据:一个无指向字符串的指针,然后将其打印出来:0x0。另一方面,内建函数println采用接口,并且通过编译器的魔力(或没有魔力),它识别出它是一个接口。如本文所述,golang接口实际上是两个指针,一个指向存储类型的信息,另一个指向底层数据。因此,内置函数println会进入接口详细信息,0x93d40即“类型信息”和0x0基础数据。(第一个0x0来自函数调用)。
interface{}
InitEfacePointer()
0x0
0x93d40
此外,测试返回的接口是否是nil一个常见错误。在这里阅读:https : //golang.org/doc/faq#nil_error
nil