贴两段代码
代码段 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 千万
问题在于,第一段代码可以正常工作,第二段代码会陷入死循环,求各位大神解惑!!
到底是什么问题呢
1
msg7086 2016-03-01 04:54:03 +08:00
虽然我不懂 Go ,但是看了你的代码以后我觉得你应该先搞清楚循环里的 cursor 和 currentCursor 到底是指向的哪个地方。
|
2
chzyer 2016-03-01 07:07:55 +08:00 via iPhone
原因是 cursor 在 for 作用域里面你又用:=声明了一个新 cursor ,这里面的 cursor 和 for 外的 cursor 是毫无关系的(虽然名字一样,但是出了{}后 cursor 就还是 0
|
3
beyondsoft 2016-03-01 08:02:37 +08:00
楼上正解 块级作用域
|
4
styx 2016-03-01 09:18:05 +08:00
楼上原因都说了,因为 cursor, _ := th.sscan(..., cursor, ...) 这句话,前一个是 for 作用域里的新的实例,后一个则是外面的参数,每次循环都会从 0 开始读,所以读不完
|
5
dododada OP 哦,还是理解错误了, thx all
|
6
vh2h 2016-03-01 09:35:04 +08:00
传说中的 go die ?
|
7
demonchang 2016-03-01 09:50:35 +08:00
- -! 我来围观头像的
|
8
angelface 2016-03-01 10:29:18 +08:00
:= 是声明操作符,不是赋值操作符
|
9
SpicyCat 2016-03-01 11:22:02 +08:00
题外话,建议楼主以后贴代码用 gist ,有高亮。
|
10
iyannik0215 2016-03-01 14:04:40 +08:00
@angelface 是声明+赋值操作符。
|
11
angelface 2016-03-01 20:33:42 +08:00
@iyannik0215 /苦笑, 对, 我说的不严谨
|