使用不同的输出函数时,为什么Golang显示不同的值

使用不同的输出函数时,为什么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) } 输出

我尝试检查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


有人能解释这种行为的机制吗?谢谢

您不应该使用,它明确指出:

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似乎是一个常见的错误。请看这里: