代码之家  ›  专栏  ›  技术社区  ›  Natalie Perret

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

go
  •  2
  • Natalie Perret  · 技术社区  · 6 年前

    我最近在玩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 但我不希望自己是一个~~类型~~的人。

    为什么我没有得到真正的类型?

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

    2 回复  |  直到 6 年前
        1
  •  5
  •   peterSO    6 年前

    The Go Programming Language Specification

    Errors

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

    type error interface {
      Error() string
    }
    

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

    Interface types

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

    The zero value

    当为变量分配存储时,可以通过声明 或调用new,或创建新值时,通过 复合文本或make调用,并且没有显式初始化 但是,变量或值被赋予一个默认值。每个元素 对于这样的变量或值,将其类型设置为零值:nil 接口。


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

        2
  •  2
  •   cn007b Dheerendra Kulkarni    6 年前

    e 是空指针

    不, error 本身-接口,所以这里没有类型。