gpt4 book ai didi

go - 为什么在 Go 中反射(reflect)错误类型的名称(或包路径)会导致 panic ?

转载 作者:行者123 更新时间:2023-12-01 22:45:25 28 4
gpt4 key购买 nike

使用反射获取 error 的名称或包路径在 Golang 中输入会导致程序崩溃(使用 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

最佳答案

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

我认为您的困惑是 TypeOf接口(interface)值的类型是其底层值的类型,它永远不是接口(interface)。您想要 TypeOf将接口(interface)值作为接口(interface)类型本身,但这不是它的工作方式。

关于go - 为什么在 Go 中反射(reflect)错误类型的名称(或包路径)会导致 panic ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61217817/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com