panic: errors: *target必须是Go中的接口或实现错误



我正在做一个json解组错误处理函数:

import "github.com/pkg/errors"
func parseJSONError(err error) {
var uterr json.UnmarshalTypeError
if errors.As(err, &uterr) {
//...
return
}
var serr json.SyntaxError
if errors.As(err, &serr) {
//...
return
}
}

errors.As()恐慌:panic: errors: *target must be interface or implement error

我们可以从github.com/pkg/errors文档中了解目标:

func As(err error, target interface{}) bool

问题是json.UnmarshalTypeErrorjson.SyntaxError实际上都实现了error接口。我们可以从encoding/json文档中了解它。所以我不知道我做错了什么。即使显式地将uterrserr转换为interface{}也不能挽救这种情况。

github.com/pkg/errors和标准errors包中都会出现panic。

errors.As的文档说明:

如果目标不是指向的非nil指针,则会panic要么是实现error的类型,或任何接口类型。如果err为nil,则As返回false。

所以你必须考虑以下几点:

  1. json.UnmarshalTypeError不支持error
  2. *json.UnmarshalTypeError可以,因为方法Error() string有一个指针接收器(docs)
  3. 根据文档,errors.As需要一个指针来实现error,所以你需要**json.UnmarshalTypeError

将代码改为:

uterr := &json.UnmarshalTypeError{}
if errors.As(err, &uterr) {
// ...
return
}

您也可以简单地添加-unsafeptr标志。像这样:

go vet -unsafeptr ./...

最新更新