我正在做一个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.UnmarshalTypeError
和json.SyntaxError
实际上都实现了error
接口。我们可以从encoding/json文档中了解它。所以我不知道我做错了什么。即使显式地将uterr
和serr
转换为interface{}
也不能挽救这种情况。
在github.com/pkg/errors
和标准errors
包中都会出现panic。
errors.As
的文档说明:
如果目标不是指向的非nil指针,则会panic要么是实现error的类型,或任何接口类型。如果err为nil,则As返回false。
所以你必须考虑以下几点:
json.UnmarshalTypeError
不支持error
。*json.UnmarshalTypeError
可以,因为方法Error() string
有一个指针接收器(docs)- 根据文档,
errors.As
需要一个指针来实现error
,所以你需要**json.UnmarshalTypeError
将代码改为:
uterr := &json.UnmarshalTypeError{}
if errors.As(err, &uterr) {
// ...
return
}
您也可以简单地添加-unsafeptr
标志。像这样:
go vet -unsafeptr ./...