为了账号安全,请及时绑定邮箱和手机立即绑定

Golang,在处理 HTTP 请求时无法将值推送到“全局”通道

Golang,在处理 HTTP 请求时无法将值推送到“全局”通道

Go
POPMUISE 2021-09-27 21:08:18
目前我正在开发一个应用程序,它可能需要几秒钟到 1 小时以上的时间来处理。因此,在其他人正在处理时使用通道来阻止请求似乎很合适。以下是我尝试完成的示例,但是我遇到了一个问题,因为在尝试将数据添加到所述通道时,我的程序似乎停滞了(见下文)。package mainimport (    "net/http"    "github.com/gorilla/mux")type Request struct {    Id string}func ConstructRequest(id string) Request {    return Request{Id: id}}var requestChannel chan Request // <- Create var for channelfunc init() {    r := mux.NewRouter()    r.HandleFunc("/request/{id:[0-9]+}", ProcessRequest).Methods("GET")    http.Handle("/", r)}func main() {    // start server    http.ListenAndServe(":4000", nil)    requestChannel = make(chan Request) // <- Make channel and assign to var    go func() {        for {            request, ok := <-requestChannel            if !ok{                return            }            fmt.Println(request.Id)        }    }()}func ProcessRequest(w http.ResponseWriter, r *http.Request) {    params := mux.Vars(r)    newRequest := api.ConstructRequest(params["id"])    requestChannel <- newRequest // <- it is stopping here, not adding the value to the channel    w.Write([]byte("Received request"))}
查看完整描述

1 回答

?
萧十郎

TA贡献1815条经验 获得超13个赞

您的频道未初始化,并且根据规范,永远发送 nil 频道块。这是因为http.ListenAndServe是一个阻塞操作,所以requestChannel = make(chan Request)你和你都没有go func()被调用。

移动http.ListenAndServemain块的末尾应该可以解决问题。


查看完整回答
反对 回复 2021-09-27
  • 1 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信