没有Json回来了

时间:2017-07-10 03:39:04

标签: json http go goroutine

我正在尝试使用Go例程将Json数据返回给请求。当我测试1(w,r)没有"去"我的代码有效。当我使用test1()作为go例程时,我没有得到任何json数据。为什么会这样?

func main() {

    http.HandleFunc("/test", viewdata)

    http.ListenAndServe(":8080", nil)
}

func viewdata(w http.ResponseWriter, r *http.Request) {

    go test1(w, r)

}

func test1(w http.ResponseWriter, r *http.Request) {

   // example struct
    ll := sample{
        "city",
        12,
    }

    w.Header().Set("Content-Type", "application/json")
    json, _ := json.Marshal(ll)
    w.Write(json)

}

2 个答案:

答案 0 :(得分:1)

根据您的代码流程,我没有看到使用goroutine的重点。愿你有什么理由。

让我们回答你的问题。目前,您的请求在由viewdata处理程序启动的goroutine之前完成。因此,您必须使用sync.WaitGroup等待goroutine test1来完成执行。

您的更新代码:

func viewdata(w http.ResponseWriter, r *http.Request) {
    var wg sync.WaitGroup
    wg.Add(1)
    go test1(w, r, &wg)
    wg.Wait()
}

func test1(w http.ResponseWriter, r *http.Request, wg *sync.WaitGroup) {
    defer wg.Done()

    ll := sample{
        "city",
        12,
    }

    w.Header().Set("Content-Type", "application/json")
    json, _ := json.Marshal(ll)
    w.Write(json)
}

答案 1 :(得分:0)

http处理程序已经作为goroutine生成。所以你不需要产生你的goroutine。

func viewdata(w http.ResponseWriter, r *http.Request) {
    ll := sample{
        "city",
        12,
    }
    w.Header().Set("Content-Type", "application/json")
    w.NewEncoder(w).Encode(ll)
}