Go语言Hashicorp不可变radix tree包for循环用法及修改疑问
Go 迭代器for循环逻辑与修改说明
原循环的运行逻辑
Go的经典for循环由三个独立语句通过分号分隔组成,执行顺序固定:
for 初始化语句; 条件判断语句; 后置迭代语句 { 循环体 }
- 初始化语句仅在首次循环开始前执行1次
- 每次执行循环体前先判断条件语句的返回值,为
true则进入循环体,为false直接终止循环 - 每次循环体执行完成后,自动执行后置迭代语句,之后再次进入条件判断步骤
你看到的循环写法是针对该基数树迭代器Next()方法的适配:迭代器的Next()方法固定返回三个值,依次为当前遍历项的键、键对应存储的值、代表是否还有有效遍历项的布尔标识ok。
for key, _, ok := it.Next(); ok; key, _, ok = it.Next()
原写法用占位符_忽略了返回的存储值,仅保留键和遍历状态,完整执行逻辑为:
- 初始化阶段调用一次
it.Next()拿到首个遍历项的键、忽略值、遍历状态 - 判断
ok为true则进入循环体处理当前键 - 循环体处理完成后,后置语句再次调用
it.Next()更新键、忽略值、遍历状态 - 重复步骤2-3,直到
ok返回false终止循环
变量修改的同步要求
你将初始化部分的_替换为自定义变量blob后,后置迭代部分的占位符必须同步修改为blob,否则会出现取值错误:
你现在未同步修改的写法:
for key, blob, ok := it.Next(); ok; key, _, ok = it.Next()
该写法仅会在初始化阶段给blob赋值为第一个遍历项的存储值,后续所有迭代中,后置语句用_忽略了返回的存储值,不会更新blob变量,你在循环体内拿到的blob永远是第一个元素的值,和当前迭代的key完全不匹配。
如果要每次循环都能拿到当前key对应的存储值,需要将后置部分同步修改:
for key, blob, ok := it.Next(); ok; key, blob, ok = it.Next()
这样每次迭代后都会更新blob为当前遍历项的存储值,循环体内的取值完全匹配。
内容的提问来源于stack exchange,提问作者thenamewasmilo
相关产品推荐
相关产品推荐

