登录
首页 >  Golang >  Go问答

如何造成 http.HandlerFunc 返回相同的随机数

来源:stackoverflow

时间:2024-03-02 11:24:28 128浏览 收藏

本篇文章向大家介绍《如何造成 http.HandlerFunc 返回相同的随机数》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。

问题内容

来自新手地鼠的问候!

我有以下多路复用器路由器设置:

s.router.handlefunc("/test", s.testhandler())

s.testhandler:

func (s *server) testhandler() http.handlerfunc {
    rnd := rand.intn(100)
    response := struct {
        rnd int `json:"rnd"`
    }{
        rnd,
    }
    return func(w http.responsewriter, r *http.request) {
        s.respond(w, r, 200, response)
        return
    }
}

辅助方法 s.respond:

func (s *server) respond(w http.ResponseWriter, r *http.Request, code int, data interface{}) {
    w.WriteHeader(code)
    if data != nil {
        json.NewEncoder(w).Encode(data)
    }
}

问题是当我发出 get /test 时,除非重新启动应用程序,否则我会看到相同的数字。

我确信我做错了什么,如果有人指出我的错误,我将不胜感激。


解决方案


Function literals

函数文字是闭包:它们可能引用定义在 周围的函数。然后这些变量在 围绕函数和函数文字,它们作为 只要它们可以访问。

testhandler() 生成一个单个随机值,然后返回一个函数文字,即一个闭包,它使用这个已经生成的值每当路由器执行时发送响应。

但是,每当调用闭包时,闭包的周围函数不会也没有理由与闭包一起执行。周围的函数仅在调用它本身时才会执行,例如当您在 s.router.handlefunc("/test", s.testhandler()) 中注册处理程序时。

因此,在提供的代码中,testhandler 中的 rand.intn 函数仅被调用一次,而不是像您似乎相信的那样,每次向服务器发出请求时都会调用它。

要解决此问题,只需将随机值生成代码移动一个级别即可:

func (s *server) TestHandler() http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        rnd := rand.Intn(100)
        response := struct {
            RND int `json:"rnd"`
        }{
            rnd,
        }

        s.respond(w, r, 200, response)
    }
}

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

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