gpt4 book ai didi

go - 为什么http.HandlerFunc总是返回相同的随机数

转载 作者:行者123 更新时间:2023-12-01 20:23:28 25 4
gpt4 key购买 nike

来自新手gopher的问候!

我有以下多路复用器路由器设置:
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

Function literals are closures: they may refer to variables defined in a surrounding function. Those variables are then shared between the surrounding function and the function literal, and they survive as long as they are accessible.


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

但是,每次调用闭包时,闭包的周围功能都不会,也没有理由与闭包一起执行。仅在调用自身周围函数时才执行周围的函数,例如在 s.router.HandleFunc("/test", s.TestHandler())中注册处理程序时。

因此,在提供的代码中, rand.Intn中的 TestHandler函数仅被调用一次,正如您似乎相信的那样,每次您访问服务器请求时都不会调用它。

要解决此问题,只需将生成随机值的代码移到以下一级:
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)
}
}

关于go - 为什么http.HandlerFunc总是返回相同的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61657469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com