我正在尝试使用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)
}
答案 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)
}