Golang Go语言代码死循环

发布于 1周前 作者 eggper 来自 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

12 回复

虽然我不懂 Go ,但是看了你的代码以后我觉得你应该先搞清楚循环里的 cursor 和 currentCursor 到底是指向的哪个地方。

更多关于Golang Go语言代码死循环的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


原因是 cursor 在 for 作用域里面你又用:=声明了一个新 cursor ,这里面的 cursor 和 for 外的 cursor 是毫无关系的(虽然名字一样,但是出了{}后 cursor 就还是 0

楼上正解 块级作用域

楼上原因都说了,因为 cursor, _ := th.sscan(…, cursor, …) 这句话,前一个是 for 作用域里的新的实例,后一个则是外面的参数,每次循环都会从 0 开始读,所以读不完

哦,还是理解错误了, thx all

传说中的 go die ?

- -! 我来围观头像的

:= 是声明操作符,不是赋值操作符

题外话,建议楼主以后贴代码用 gist ,有高亮。

是声明+赋值操作符。

/苦笑, 对, 我说的不严谨

在Go语言中,代码死循环通常是由于逻辑错误或不当的控制流结构导致的。处理这种问题,你需要检查循环条件和控制语句,确保它们能够正确终止循环。

以下是一些常见的导致死循环的原因及解决方法:

  1. 循环条件永真:检查for循环的条件表达式,确保它有可能变为假。例如,for true将永远为真,除非在循环体内有break语句。

  2. 缺少递增/递减操作:在for循环中,确保有递增或递减操作来逐步改变循环变量的值,使其最终满足退出循环的条件。

  3. 无限递归:如果使用了递归函数,确保递归有明确的终止条件。没有正确终止条件的递归调用将导致栈溢出错误,但也可以视为一种形式的死循环。

  4. 通道(Channel)阻塞:在使用Go的goroutine和通道时,确保通道操作不会导致永久的阻塞。例如,如果一个goroutine永远等待一个不会发送数据的通道,就会发生死锁。

  5. 逻辑错误:有时,复杂的逻辑结构可能导致难以察觉的死循环。在这种情况下,逐步调试和添加日志输出可能是找到问题的关键。

解决死循环问题通常需要仔细检查代码逻辑,并可能需要对程序进行逐步调试。使用Go的调试工具,如Delve,可以帮助你逐步执行代码并检查变量的状态,从而找到导致死循环的根本原因。

回到顶部