Golang中如何在布尔条件右侧检查字典键存在并支持短路求值
Go语言中map数组迭代时的键存在性检查写法问题
你想在迭代map数组时,检查当前键是否存在于下一个map中,并且希望用一行带短路求值的写法,但你给出的代码不符合Go语法,无法通过编译。
原因很明确:Go语言规定,if语句的条件部分只能是布尔表达式,不能包含短变量声明(:=)操作。短变量声明只能放在if语句的初始化语句段里(也就是if后面跟分号分隔的初始化代码),不能塞在条件表达式的括号中。
要实现你的需求,同时保留短路求值(避免index越界时访问arr[index+1]),最清晰且符合规范的写法是嵌套if:
for index, m := range arr { key := // 当前迭代的键 if index < len(arr)-1 { if _, ok := arr[index+1][key]; ok { // 键存在于下一个map时的逻辑 } } }
如果追求尽量紧凑的写法,也可以利用if的初始化语句段,把ok的声明前置,但同样要先保证index的合法性:
for index, m := range arr { key := // 当前迭代的键 var ok bool if index < len(arr)-1 { _, ok = arr[index+1][key] } if ok { // 执行逻辑 } }
两种写法都能保证短路求值:当index已经是数组最后一个元素时,不会执行arr[index+1]的访问,避免数组越界 panic,同时正确判断键的存在性。
内容的提问来源于stack exchange,提问作者iggy12345
相关产品推荐
相关产品推荐

