V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
dododada
V2EX  ›  Go 编程语言

go 代码死循环

  •  
  •   dododada · 2016-03-01 01:11:47 +08:00 · 1887 次点击
    这是一个创建于 3189 天前的主题,其中的信息可能已经有所发展或是发生改变。

    贴两段代码
    代码段 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 千万

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

    到底是什么问题呢

    11 条回复    2016-03-01 20:33:42 +08:00
    msg7086
        1
    msg7086  
       2016-03-01 04:54:03 +08:00
    虽然我不懂 Go ,但是看了你的代码以后我觉得你应该先搞清楚循环里的 cursor 和 currentCursor 到底是指向的哪个地方。
    chzyer
        2
    chzyer  
       2016-03-01 07:07:55 +08:00 via iPhone
    原因是 cursor 在 for 作用域里面你又用:=声明了一个新 cursor ,这里面的 cursor 和 for 外的 cursor 是毫无关系的(虽然名字一样,但是出了{}后 cursor 就还是 0
    beyondsoft
        3
    beyondsoft  
       2016-03-01 08:02:37 +08:00
    楼上正解 块级作用域
    styx
        4
    styx  
       2016-03-01 09:18:05 +08:00
    楼上原因都说了,因为 cursor, _ := th.sscan(..., cursor, ...) 这句话,前一个是 for 作用域里的新的实例,后一个则是外面的参数,每次循环都会从 0 开始读,所以读不完
    dododada
        5
    dododada  
    OP
       2016-03-01 09:28:50 +08:00
    哦,还是理解错误了, thx all
    vh2h
        6
    vh2h  
       2016-03-01 09:35:04 +08:00
    传说中的 go die ?
    demonchang
        7
    demonchang  
       2016-03-01 09:50:35 +08:00
    - -! 我来围观头像的
    angelface
        8
    angelface  
       2016-03-01 10:29:18 +08:00
    := 是声明操作符,不是赋值操作符
    SpicyCat
        9
    SpicyCat  
       2016-03-01 11:22:02 +08:00
    题外话,建议楼主以后贴代码用 gist ,有高亮。
    iyannik0215
        10
    iyannik0215  
       2016-03-01 14:04:40 +08:00
    @angelface 是声明+赋值操作符。
    angelface
        11
    angelface  
       2016-03-01 20:33:42 +08:00
    @iyannik0215 /苦笑, 对, 我说的不严谨
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2919 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 03:38 · PVG 11:38 · LAX 19:38 · JFK 22:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.