为什么`fmt.Println(“%T \ n”,e)`中的`e`是错误变量会打印出<nil>而不是其类型?

时间:2019-01-30 15:21:09

标签: go

我最近正在玩Go语言,至少可以说有点奇怪,让我们考虑一个非常简单的功能:

func main() {
    n, e := fmt.Println(`He said: "Hello"`)
    fmt.Printf("%T\n", n)
}

输出我所期望的:

He said: "Hello"
int

现在,如果我想显示e的类型:

func main() {
    n, e := fmt.Println(`He said: "Hello"`)
    fmt.Printf("%T\n", e)
}

这一次打印出来:

He said: "Hello"
<nil>

我认为没有错误,所以e是一个空指针:nil,但我不希望自己成为~~ type ~~。

为什么我没有得到实际的类型?

如果是,是否有解决方法? (不是说我的用例是一个现实的案例,但是好奇是否有可能)

2 个答案:

答案 0 :(得分:5)

  

The Go Programming Language Specification

     

Errors

     

预定义的类型错误定义为

type error interface {
  Error() string
}
     

它是表示错误情况的常规界面,   nil值表示没有错误。

     

Interface types

     

接口类型指定一个称为其接口的方法集。一种   接口类型的变量可以使用方法存储任何类型的值   设置为接口的任何超集。据说这种类型   实现接口。未初始化的变量的值   接口类型为nil。

     

The zero value

     

当通过声明为变量分配存储空间时   或调用new或创建新值时(通过   复合文字或make的调用,并且没有显式初始化   如果提供,则变量或值被赋予默认值。每个元素   变量或值的类型为其类型的零值:nil   用于界面。


零值error类型(接口)没有类型。其值为nil

答案 1 :(得分:2)

  

e是一个空指针

不是,error本身-界面,所以您在这里无需输入文字。