当前位置: 首页 > 面试题库 >

恐慌:最后一个参数必须为http.HandlerFunc类型

司寇瑾瑜
2023-03-14
问题内容

我有这个辅助函数,可以正常编译:

func Middleware(adapters ...interface{}) http.HandlerFunc {

    log.Info("length of adapters:", len(adapters))

    if len(adapters) < 1 {
        panic("Adapters need to have length > 0.");
    }

    h, ok := (adapters[len(adapters)-1]).(http.HandlerFunc)

    if ok == false {
        panic("Last argument needs to be of type http.HandlerFunc") // ERROR HERE
    }

    adapters = adapters[:len(adapters)-1]

    for _, adapt := range adapters {
        h = (adapt.(AdapterFunc))(h)
    }

    return h

}

我这样称呼它:

router.HandleFunc("/share", h.makeGetMany(v)).Methods("GET")

func (h Handler) makeGetMany(v Injection) http.HandlerFunc {
    return mw.Middleware(
        mw.Allow("admin"),
        func(w http.ResponseWriter, r *http.Request) {
            log.Println("now we are sending response.");
            json.NewEncoder(w).Encode(v.Share)
        },
    )
}

问题是我收到此错误,但我无法弄清原因:

    panic: Last argument needs to be of type http.HandlerFunc

    goroutine 1 [running]:
    huru/mw.Middleware(0xc420083d40, 0x2, 0x2, 0xc42011f3c0)
            /home/oleg/codes/huru/api/src/huru/mw/middleware.go:301

+0x187
huru/routes/share.Handler.makeGetMany(0xc4200ae1e0, 0x10)
/home/oleg/codes/huru/api/src/huru/routes/share/share.go:62
+0x108


它确实确认适配器片的长度为2:

 length of adapters:2

有谁知道为什么这种类型的断言在这种情况下会失败?没有意义。也许我实际上不是在检索切片的最后一个参数或其他内容?是否有更好的方法可以将最后一个参数弹出切片?


问题答案:

您需要使用来将mw.Middleware()statement 的第二个参数包装为http.Handlertype
http.HandlerFunc()

func (h Handler) makeGetMany(v Injection) http.HandlerFunc {
    return mw.Middleware(
        mw.Allow("admin"),
        http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            log.Println("now we are sending response.");
            json.NewEncoder(w).Encode(v.Share)
        }),
    )
}


 类似资料:
  • 问题内容: 调用反射值的.FieldByName方法时出现以下错误,确切的错误是:- 和代码是:- 我了解的并不多,但这就是我所能获得的所有信息。 这是Go Playground上代码的链接:http : //play.golang.org/p/E038cPOoGp 问题答案: 您已经是一个指向结构的指针。尝试打印出您的代码。 没有理由使用的地址,然后调用that ,它会取消对刚创建的指针的引用。

  • 我目前正在考虑如何编写测试来检查给定的代码是否出现了恐慌?我知道Go使用来捕捉恐慌,但与Java代码不同的是,您不能真正指定在发生恐慌时应该跳过哪些代码或您有哪些代码。所以如果我有一个函数: 我真的不知道是否发生了恐慌,我们恢复了,或者函数是否根本没有恐慌。如何指定在没有恐慌的情况下跳过哪些代码,以及在出现恐慌的情况下执行哪些代码?我如何检查我们是否从恐慌中恢复过来?

  • 在Golang中,没有恢复的panic将使进程崩溃,因此我最后将以下代码片段放在每个函数的开头: 只是为了防止我的程序崩溃。现在我在想,真的是要走的路吗?因为我觉得到处放同样的代码看起来有点奇怪。 在我看来,这是Java的方式,将异常冒泡到调用函数,直到main函数成为控制异常/恐慌的更好方式。我明白这是Go的设计,但像Go一样立即崩溃进程的好处是什么?

  • 我创建了这个类。但我得到了这个错误 函数必须有一个明确的参数列表。尝试添加参数列表 我试过的 升级颤振 颤振医生输出

  • 问题内容: 我正在使用Go内置的http服务器,并拍拍来响应一些URL: 我需要向该处理函数传递一个额外的参数-一个接口。 如何向处理程序函数发送额外的参数? 问题答案: 通过使用闭包,您应该能够做您想做的事情。 更改为以下内容(未测试): 然后对

  • 作为一个极简的示例,此代码并不恐慌 但是,直接用recover替换匿名函数会引起恐慌