-3

在 Golang中使用反射来获取error类型的名称或包路径会导致程序崩溃(带有panic: runtime error: invalid memory address or nil pointer dereference)。

这种行为的原因是什么?(对其他内置类型执行相同的操作会返回类型名称和包路径的空字符串。)

我对语言的设计很感兴趣——我不明白为什么它对于error类型的行为与其他内置类型不同是可取的。

例如:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var str string
    strType := reflect.TypeOf(str)
    fmt.Println(strType.Name()) // OK
    fmt.Println(strType.PkgPath())  // OK

    var err error
    errType := reflect.TypeOf(err)
    fmt.Println(errType.Name()) // panics
    fmt.Println(errType.PkgPath())  // also panics
}

去游乐场: https: //play.golang.org/p/JBMhMkjGPEV

4

1 回答 1

3

error没什么特别的,只是它是一个接口。

reflect.TypeOf接受一个类型的参数interface{}。如果您使用非接口值调用它,则该值及其类型被包装在一个interface{}. 如果使用接口值调用它,则从接口中提取底层值和类型,并包装在一个新interface{}值中。如果你用一个空接口调用它(就像你在这里做的那样,因为error它是一个接口并且它是零初始化的),那么就没有基础值和类型,并且参数reflect.TypeOf是一个新的 nilinterface{}值。reflect.TypeOf在这种情况下被定义为返回nil,导致你的 nil 问题。

我认为你的困惑是TypeOf接口值的类型是它的底层值的类型,它永远不是接口。您希望TypeOf接口值本身就是接口类型,但这不是它的工作方式。

于 2020-04-15T04:00:45.680 回答