go 代码死循环

2016-03-01 01:11:47 +08:00
 dododada

贴两段代码
代码段 1 :
cursor := 0
for {
currentCursor, members := th.sscan(c_push, cursor, MAX_BATCH_SSCAN, all_user)
cursor = currentCursor
if len(members) > 0 {
cursor = currentCursor
json_message, _ := json.Marshal(message)
c_default.Do("HINCRBY", redisStatsKey, redisStatsFiled, len(members))
}
if currentCursor == 0 {
break
}
}

代码段 2 :
cursor := 0
for {
cursor, members := th.sscan(c_push, cursor, MAX_BATCH_SSCAN, alluser)
if len(members) > 0 {
json_message, _ := json.Marshal(message)
c_default.Do("HINCRBY", redisStatsKey, redisStatsFiled, len(members))
}
if cursor == 0 {
break
}
}
两段代码功能相同,都是利用 sscan 操作 redis, 不同的地方在于 代码段 1 有赋值 cursor = currentCursor , 其中: MAX_BATCH_SSCAN=1000 ,每次 scan 一千条数据, alluser 有 4 千万

问题在于,第一段代码可以正常工作,第二段代码会陷入死循环,求各位大神解惑!!

到底是什么问题呢

1808 次点击
所在节点    Go 编程语言
11 条回复
msg7086
2016-03-01 04:54:03 +08:00
虽然我不懂 Go ,但是看了你的代码以后我觉得你应该先搞清楚循环里的 cursor 和 currentCursor 到底是指向的哪个地方。
chzyer
2016-03-01 07:07:55 +08:00
原因是 cursor 在 for 作用域里面你又用:=声明了一个新 cursor ,这里面的 cursor 和 for 外的 cursor 是毫无关系的(虽然名字一样,但是出了{}后 cursor 就还是 0
beyondsoft
2016-03-01 08:02:37 +08:00
楼上正解 块级作用域
styx
2016-03-01 09:18:05 +08:00
楼上原因都说了,因为 cursor, _ := th.sscan(..., cursor, ...) 这句话,前一个是 for 作用域里的新的实例,后一个则是外面的参数,每次循环都会从 0 开始读,所以读不完
dododada
2016-03-01 09:28:50 +08:00
哦,还是理解错误了, thx all
vh2h
2016-03-01 09:35:04 +08:00
传说中的 go die ?
demonchang
2016-03-01 09:50:35 +08:00
- -! 我来围观头像的
angelface
2016-03-01 10:29:18 +08:00
:= 是声明操作符,不是赋值操作符
SpicyCat
2016-03-01 11:22:02 +08:00
题外话,建议楼主以后贴代码用 gist ,有高亮。
iyannik0215
2016-03-01 14:04:40 +08:00
@angelface 是声明+赋值操作符。
angelface
2016-03-01 20:33:42 +08:00
@iyannik0215 /苦笑, 对, 我说的不严谨

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/260060

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX