我正在 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
}
}
Run Code Online (Sandbox Code Playgroud)
但有一种恐慌errors.As():panic: errors: *target must be interface or implement error。
我们可以从github.com/pkg/errors 文档中了解 target 是什么:
func As(err error, target interface{}) bool
问题在于两者json.UnmarshalTypeError实际上json.SyntaxError都实现了该error接口。我们可以从encoding/json文档中了解到。所以我不知道我做错了什么。即使显式转换uterrand serrto 也interface{}不能挽救这种情况。
恐慌发生在标准包github.com/pkg/errors和标准errors包中。
bla*_*een 17
状态的文档errors.As:
如果 target 不是指向实现 error 的类型或任何接口类型的非零指针,则会出现恐慌。如果 err 为零,则 as 返回 false。
所以你必须考虑以下几点:
json.UnmarshalTypeError不执行error。*json.UnmarshalTypeError确实如此,因为该方法Error() string有一个指针接收器(文档)errors.As想要一个指向实现的指针error,所以你需要**json.UnmarshalTypeError将代码更改为:
uterr := &json.UnmarshalTypeError{}
if errors.As(err, &uterr) {
// ...
return
}
Run Code Online (Sandbox Code Playgroud)