我有一个中间件函数:
func errorMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
defer func() {
if err := recover(); err != nil {
log.Error("Caught error in defer/recover middleware: ", err)
w.WriteHeader(http.StatusInternalServerError)
json.NewEncoder(w).Encode(struct {
ID string
}{
err.Error(),
})
}
}()
next.ServeHTTP(w, r)
})
}我这样使用它:
router := mux.NewRouter()
router.Use(errorMiddleware)然而,我得到了一个编译错误,它说:

有人知道这是怎么回事吗?我只是尝试将err转换为字符串,最终为客户端序列化它,等等。
发布于 2018-10-26 13:55:57
recover()返回一个没有代理panic()发送的任何值的方法的接口。在defer块中,您试图访问一个纯的、没有方法的接口的Error()方法。如果要区分内置错误类型,则必须断言其类型,如下所示:
realErr, ok := err.(error)
if ok {
// here you can use realErr.Error().
}所以它会给你一个error类型的实值。如果您查看built-in types,您将看到error将实现一个Error() string方法。
https://stackoverflow.com/questions/53002131
复制相似问题