Golang Go语言代码死循环
贴两段代码
代码段 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 千万
问题在于,第一段代码可以正常工作,第二段代码会陷入死循环,求各位大神解惑!!
到底是什么问题呢
Golang Go语言代码死循环
更多关于Golang Go语言代码死循环的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
虽然我不懂 Go ,但是看了你的代码以后我觉得你应该先搞清楚循环里的 cursor 和 currentCursor 到底是指向的哪个地方。
更多关于Golang Go语言代码死循环的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
原因是 cursor 在 for 作用域里面你又用:=声明了一个新 cursor ,这里面的 cursor 和 for 外的 cursor 是毫无关系的(虽然名字一样,但是出了{}后 cursor 就还是 0
楼上正解 块级作用域
哦,还是理解错误了, thx all
传说中的 go die ?
- -! 我来围观头像的
:= 是声明操作符,不是赋值操作符
题外话,建议楼主以后贴代码用 gist ,有高亮。
是声明+赋值操作符。
/苦笑, 对, 我说的不严谨
在Go语言中,代码死循环通常是由于逻辑错误或不当的控制流结构导致的。处理这种问题,你需要检查循环条件和控制语句,确保它们能够正确终止循环。
以下是一些常见的导致死循环的原因及解决方法:
-
循环条件永真:检查
for
循环的条件表达式,确保它有可能变为假。例如,for true
将永远为真,除非在循环体内有break
语句。 -
缺少递增/递减操作:在
for
循环中,确保有递增或递减操作来逐步改变循环变量的值,使其最终满足退出循环的条件。 -
无限递归:如果使用了递归函数,确保递归有明确的终止条件。没有正确终止条件的递归调用将导致栈溢出错误,但也可以视为一种形式的死循环。
-
通道(Channel)阻塞:在使用Go的goroutine和通道时,确保通道操作不会导致永久的阻塞。例如,如果一个goroutine永远等待一个不会发送数据的通道,就会发生死锁。
-
逻辑错误:有时,复杂的逻辑结构可能导致难以察觉的死循环。在这种情况下,逐步调试和添加日志输出可能是找到问题的关键。
解决死循环问题通常需要仔细检查代码逻辑,并可能需要对程序进行逐步调试。使用Go的调试工具,如Delve,可以帮助你逐步执行代码并检查变量的状态,从而找到导致死循环的根本原因。