一尘不染

为什么Golang在使用不同的输出功能时显示不同的值

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)
}

输出为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)

谁能解释这种行为的机制?谢谢!


阅读 188

收藏
2020-07-02

共1个答案

一尘不染

首先,fmt.Println内建println是非常不同的问题:在实现和目的上都不同。fmt.Println使用反射处理许多复杂的情况,而println仅处理一些基本情况,并且仅用于“引导或调试”(如规范所述)。

在这种情况下,您将打印interface{}从返回的InitEfacePointer()。在fmt.Println外观到使用界面反映和获取基础数据:一个无指向字符串的指针,然后将其打印出来:0x0。另一方面,内建函数println采用接口,并且通过编译器的魔力(或没有魔力),它识别出它是一个接口。如本文所述,golang接口实际上是两个指针,一个指向存储类型的信息,另一个指向底层数据。因此,内置函数println会进入接口详细信息,0x93d40即“类型信息”和0x0基础数据。(第一个0x0来自函数调用)。

此外,测试返回的接口是否是nil一个常见错误。在这里阅读:https :
//golang.org/doc/faq#nil_error

2020-07-02