现在我有这个:type AppError struct{ Status int Message string}func (h NearbyHandler) makeUpdate(v NearbyInjection) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { item, ok := v.Nearby[params["id"]] if !ok { return AppError{ 500, "Missing item in map.", } } }}问题是如果我这样做:func (h NearbyHandler) makeUpdate(v NearbyInjection) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) AppError { // <<< return AppError }}不会编译 b/c http.HandlerFunc 不会返回返回 AppError 的函数。nil我的另一个问题是,如果我使用 AppError 作为返回值,如何避免显式返回?请注意,我收到此错误:不能在返回参数中使用 func 文字(类型 func(http.ResponseWriter, *http.Request) AppError)作为类型 http.HandlerFunc
3 回答
犯罪嫌疑人X
TA贡献2080条经验 获得超4个赞
它是一个服务器,处理程序不应返回错误,因为据说您应该简单地通知客户端在处理请求时遇到了错误。判断错误类型并输出相应的http代码和可选的消息体。
现在,如果碰巧你的服务器有一些其他的 goroutines 需要被通知你可以通过一个通道向他们发送错误信号(用于指标或类似的东西),所以你可以以任何你希望的方式使用错误在处理程序范围之外。
繁华开满天机
TA贡献1816条经验 获得超4个赞
不会编译 b/c http.HandlerFunc 不会返回返回 AppError 的函数。
为什么不直接在 makeUpdate 方法中处理错误?
如果我使用 AppError 作为返回值,如何避免显式返回 nil?
不能在返回参数中使用 'nil' 作为 AppError 类型,您可以使用初始值,如下所示:
func test() AppError {
ret := AppError{
200, "OK",
}
condition := true // some condition
if !condition {
ret.Status = 500
ret.Message = "internal error"
}
return ret
}
九州编程
TA贡献1785条经验 获得超4个赞
因此,go 的设计者没有返回请求的状态,而是给了您ResponseWriter。这是您与客户的主要互动。例如设置一个状态码,做WriteHeader(500)
。
- 3 回答
- 0 关注
- 137 浏览
添加回答
举报
0/150
提交
取消