使用不同的输出函数时,为什么Golang显示不同的值
我尝试检查Golang何时将本地值返回为nil,然后使用此代码使用不同的输出函数时,为什么Golang显示不同的值,go,Go,我尝试检查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) } 输出
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
有人能解释这种行为的机制吗?谢谢 您不应该使用,它明确指出: println内置函数在 实现特定的方法,并将结果写入标准错误。 始终在参数之间添加空格,并追加换行符。 Println用于引导和调试;事实并非如此 保证用这种语言 报告还提到: 当前的实现提供了几个有用的内置函数 在引导过程中。记录这些功能的完整性 但不保证会继续使用这种语言。他们不回电话 结果 实现限制:print和println不需要 接受任意参数类型,但打印布尔值、数值和 必须支持字符串类型 就是这样。print和println是有用的调试工具,但不应依赖于: 提供特定的输出 在不同的平台上提供相同的输出 随时间提供相同的输出 存在
也就是说,我猜在您的情况下,它正在打印内部接口字段:一个指向类型的指针和一个值。您不应该使用,它清楚地指出: println内置函数在 实现特定的方法,并将结果写入标准错误。 始终在参数之间添加空格,并追加换行符。 Println用于引导和调试;事实并非如此 保证用这种语言 报告还提到: 当前的实现提供了几个有用的内置函数 在引导过程中。记录这些功能的完整性 但不保证会继续使用这种语言。他们不回电话 结果 实现限制:print和println不需要 接受任意参数类型,但打印布尔值、数值和 必须支持字符串类型 就是这样。print和println是有用的调试工具,但不应依赖于: 提供特定的输出 在不同的平台上提供相同的输出 随时间提供相同的输出 存在 也就是说,我猜在您的例子中,它正在打印内部接口字段:指向类型的指针和值。首先,fmt.Println和内置Println是非常不同的内容:它们在实现和用途上都不同。Println使用reflect处理许多复杂的情况,而Println只处理一些基本情况,并且只用于引导或调试,如规范所述 在本例中,您正在打印从InitEfacePointer返回的接口{}。Println使用reflect查看接口并获取底层数据:指向字符串的nil指针,然后将其打印出来:0x0。另一方面,内置的println接受了接口,通过编译器的魔力,它识别出它是一个接口。实际上,golang接口是两个指针,一个指向存储类型的信息,另一个指向底层数据。因此内置的println进入接口细节,0x93d40是类型信息,0x0是基础数据。第一个0x0来自函数调用 此外,测试返回的接口是否为nil似乎是一个常见的错误。阅读此处:首先,fmt.Println和内置Println是非常不同的材料:它们在实现和用途上都不同。Println使用reflect处理许多复杂的情况,而Println只处理一些基本情况,并且只用于引导或调试,如规范所述 在本例中,您正在打印从InitEfacePointer返回的接口{}。Println使用reflect查看接口并获取底层数据:指向字符串的nil指针,然后将其打印出来:0x0。另一方面,内置的println接受了接口,通过编译器的魔力,它识别出它是一个接口。实际上,golang接口是两个指针,一个指向存储类型的信息,另一个指向底层数据。因此内置的println进入接口细节,0x93d40是类型信息,0x0是基础数据。第一个0x0来自函数调用 此外,测试返回的接口是否为nil似乎是一个常见的错误。请看这里: