V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
dododada

go 代码死循环

  •  
  •   dododada · Mar 1, 2016 · 2342 views
    This topic created in 3721 days ago, the information mentioned may be changed or developed.

    贴两段代码
    代码段 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 replies    2016-03-01 20:33:42 +08:00
    msg7086
        1
    msg7086  
       Mar 1, 2016
    虽然我不懂 Go ,但是看了你的代码以后我觉得你应该先搞清楚循环里的 cursor 和 currentCursor 到底是指向的哪个地方。
    chzyer
        2
    chzyer  
       Mar 1, 2016 via iPhone
    原因是 cursor 在 for 作用域里面你又用:=声明了一个新 cursor ,这里面的 cursor 和 for 外的 cursor 是毫无关系的(虽然名字一样,但是出了{}后 cursor 就还是 0
    beyondsoft
        3
    beyondsoft  
       Mar 1, 2016
    楼上正解 块级作用域
    styx
        4
    styx  
       Mar 1, 2016
    楼上原因都说了,因为 cursor, _ := th.sscan(..., cursor, ...) 这句话,前一个是 for 作用域里的新的实例,后一个则是外面的参数,每次循环都会从 0 开始读,所以读不完
    dododada
        5
    dododada  
    OP
       Mar 1, 2016
    哦,还是理解错误了, thx all
    vh2h
        6
    vh2h  
       Mar 1, 2016
    传说中的 go die ?
    demonchang
        7
    demonchang  
       Mar 1, 2016
    - -! 我来围观头像的
    angelface
        8
    angelface  
       Mar 1, 2016
    := 是声明操作符,不是赋值操作符
    SpicyCat
        9
    SpicyCat  
       Mar 1, 2016
    题外话,建议楼主以后贴代码用 gist ,有高亮。
    iyannik0215
        10
    iyannik0215  
       Mar 1, 2016
    @angelface 是声明+赋值操作符。
    angelface
        11
    angelface  
       Mar 1, 2016
    @iyannik0215 /苦笑, 对, 我说的不严谨
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3051 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 52ms · UTC 14:14 · PVG 22:14 · LAX 07:14 · JFK 10:14
    ♥ Do have faith in what you're doing.