2 回答
TA贡献1770条经验 获得超3个赞
有几种方法可以做到这一点,一个简单的方法是使用渠道
将 getTitle 函数更改为此
func getTitle(resultCh chan string) {
time.Sleep(2 * time.Second)
resultCh <- "Game Of Thrones"
}
getPosts 会像这样使用它
func getPosts(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
ch := make(chan string)
go getTitle(ch)
s := <-ch // this will wait until getTile inserts data to channel
p := Post{
ID: s,
}
json.NewEncoder(w).Encode(p)
}
我怀疑你是新来的,这是一个基本的频道用法,在这里查看更多详细信息频道
TA贡献1775条经验 获得超11个赞
所以你遇到的问题是你还没有真正了解如何处理并发代码(不是dis,我曾经在那里)。其中大部分都不是围绕渠道进行的。正如@kojan 的回答所解释的那样,这些频道工作正常。出问题的地方在于i变量。首先,您必须了解这i不是原子突变,因此如果您的客户端请求并行到达,您可能会弄乱数字:
C1 : C2:
i == 6 i == 6
i++ i++
i == 7 i == 7
软件中的两个增量实际上变成了一个增量,因为实际上i++是 3 个操作:加载、增量、存储。
你遇到的第二个问题是它i不是一个指针,所以当你传递i给你的 go 例程时,你正在制作一个副本。go 例程中的i被发送回通道,并成为连接字符串中的第一个数字,您可以观看增量。然而i,在字符串尾部使用的剩余部分继续通过连续的客户端调用增加。
- 2 回答
- 0 关注
- 122 浏览
添加回答
举报