Gin框架使用goroutine中处理模型绑定遇到问题,请教。

haojiale · 2023-06-05 15:20:48 · 2224 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2023-06-05 15:20:48 的主题,其中的信息可能已经有所发展或是发生改变。

在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",
    })
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2224 次点击  
加入收藏 微博
6 回复  |  直到 2023-06-06 17:24:26
sanrentai
sanrentai · #1 · 2年之前
data := make(map[string]interface{})
 c.ShouldBindJSON(&data)

把它放到goroutine之外呢,参数传data

haojiale
haojiale · #2 · 2年之前
sanrentaisanrentai #1 回复

``` data := make(map[string]interface{}) c.ShouldBindJSON(&data) ``` 把它放到goroutine之外呢,参数传data

感谢! 放在goroutine之外是正常的,目前应该是需要这么做才能继续了。

但是还是想搞清楚为什么放进goroutine之内会造成这样的结果。

haha_cat
haha_cat · #3 · 2年之前

我试了下 没有发现data为空的情况 你是怎么触发的 并发请求?

Neightly
Neightly · #4 · 2年之前

Context被复制了,不等于Request被复制了。 请求体是一次性的,读完了就没有了。 Bind的时候是有error的,可惜你忽略了,那里发生EOF了。

haojiale
haojiale · #5 · 2年之前

确实有几率触发错误,http: invalid Read on closed Body,应该是函数主体先于goroutine执行结束了

abelli5
abelli5 · #6 · 2年之前

模拟浏览器方法默认为 GET。如果使用 POST方法,必须先设置POST模式、然后调用 post 方法。 上述代码的协程可能在 c.JSON(...) 后面执行,GET模式下无法接收内容体,导致失败。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传