在gin代码中使用了goroutine处理POST请求过来的json数据
以下示例代码中,绑定请求获得的data,经常除了第一次有数据以外,其它请求获得都是一个空map,这个代码有什么问题?
有没有老大指教一下
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.POST("/task", task)
r.Run()
}
func task(c *gin.Context) {
cc := c.Copy()
go func (c *gin.Context) {
data := make(map[string]interface{})
c.ShouldBindJSON(&data)
fmt.Println("task start")
fmt.Println(data)
fmt.Println("task end")
} (cc)
c.JSON(200, gin.H{
"result": "success",
})
}
有疑问加站长微信联系(非本文作者)

把它放到goroutine之外呢,参数传data
感谢! 放在goroutine之外是正常的,目前应该是需要这么做才能继续了。
但是还是想搞清楚为什么放进goroutine之内会造成这样的结果。
我试了下 没有发现data为空的情况 你是怎么触发的 并发请求?
Context被复制了,不等于Request被复制了。 请求体是一次性的,读完了就没有了。 Bind的时候是有error的,可惜你忽略了,那里发生EOF了。
确实有几率触发错误,http: invalid Read on closed Body,应该是函数主体先于goroutine执行结束了
模拟浏览器方法默认为 GET。如果使用 POST方法,必须先设置POST模式、然后调用 post 方法。 上述代码的协程可能在 c.JSON(...) 后面执行,GET模式下无法接收内容体,导致失败。