而不是它的类型?,go"/>

首页 > 解决方案 > 为什么 `fmt.Println("%T\n", e)` 其中 `e` 是一个错误变量会打印出来而不是它的类型?

问题描述

我最近在玩 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~~ 。

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

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

标签: go

解决方案


Go 编程语言规范

错误

预先声明的类型错误定义为

type error interface {
  Error() string
}

它是表示错误条件的常规接口,nil 值表示没有错误。

接口类型

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

零值

当通过声明或 new 调用为变量分配存储空间时,或者通过复合文字或 make 调用创建新值时,并且未提供显式初始化,则给出变量或值默认值。这样一个变量或值的每个元素都被设置为它的类型的零值:nil 用于接口。


一个零值error类型,一个接口,没有类型。它的值是nil


推荐阅读