登录
首页 >  Golang >  Go问答

条件连接的golang中http处理程序

来源:stackoverflow

时间:2024-02-18 10:24:24 406浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《条件连接的golang中http处理程序》,聊聊,我们一起来看看吧!

问题内容

我想根据特定条件有条件地添加 http 处理程序

func ConditionalCheck(arg string) func(http.Handler) http.Handler {
    return func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            ctx := r.Context()
            check, ok := ctx.Value("specific").(bool);
            if check {
                SpecificCheck(arg)
            } else {
                next.ServeHTTP(w, r)
            }
        })
    }
}

func SpecificCheck(arg string) func(http.Handler) http.Handler {
    return func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            // something
            next.ServeHTTP(w, r)
        })
    }
}

chain := alice.New(ConditionalCheck, .........)

当我测试时,specificcheck handlerfunc 没有被调用。 我如何根据条件链接它?


正确答案


sepecificcheck 仅返回一个函数,该函数接受一个处理程序并返回另一个处理程序,它不会执行任何这些返回的对象。如果您想执行这些对象,则必须显式执行,例如

sepecificcheck(arg)(next).servehttp(w, r)

上面立即调用 sepecificcheck 返回的中间件函数,然后在该中间件函数返回的处理程序上调用 servehttp 方法。

然后,更新后的 conditionalcheck 需要以下内容:

func conditionalcheck(arg string) func(http.handler) http.handler {
    return func(next http.handler) http.handler {
        return http.handlerfunc(func(w http.responsewriter, r *http.request) {
            ctx := r.context()
            check, ok := ctx.value("specific").(bool)
            if check {
                specificcheck(arg)(next).servehttp(w, r)
            } else {
                next.servehttp(w, r)
            }
        })
    }
}

您的函数 specificcheck 仅返回匿名函数,但不调用它。您必须添加返回函数的调用,例如 specificcheck(arg)()

例如


    package main
    
    import "fmt"
    
    func main() {
        test("eugene")
    }
    
    func test(name string) func() {
        return func() {
            fmt.println("hello! " + name)
        }
    }

可以看到,输出为空

但是这段代码可以正常工作

    package main
    
    import "fmt"
    
    func main() {
        test("Eugene")()
    }
    
    func test(name string) func() {
        return func() {
            fmt.Println("Hello! " + name)
        }
    }

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《条件连接的golang中http处理程序》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>