在布尔条件右侧检查 Golang 中的字典键是否存在

Checking Dictionary Key Existence in Golang on right side of boolean condition

提问人:iggy12345 提问时间:7/19/2023 更新时间:7/19/2023 访问量:88

问:

我在 golang 中有一个映射数组,我正在遍历列表,需要检查列表中的下一个映射中是否存在当前迭代的键,我知道检查映射中是否存在元素的正常方法是:

if _, ok := m[key]; ok {
  ...
}

但是有没有办法做到这一点呢?

if index < len(arr)-1 && (_, ok := arr[index+1][key]; ok) {
  ...
}

短路在哪里起作用,代码保持在一行中?

go 条件语句 短路

评论

0赞 Stephan Schlecht 7/19/2023
如果映射中不存在键,它将返回零值,例如,如果您的映射看起来像这样,它将返回一个空字符串。那么你的情况可能看起来像这样:map[string]stringifif index < len(arr)-1 && arr[index+1][key] != "" {
0赞 Zeke Lu 7/19/2023
@StephanSchlecht 请注意,地图可能包含以“”为值的项目。所以并不意味着密钥不存在。map[key] == ""
0赞 Stephan Schlecht 7/19/2023
是的,当然,如果零值在 OP 用例的预期有效数据值范围内,则在这种情况下它不能用作哨兵。
0赞 iggy12345 7/19/2023
该映射包含一组结构,可能存在零值,因此我无法检查它

答:

2赞 Zeke Lu 7/19/2023 #1

AFAIK,没有办法在一行内完成。

嘿,Go 甚至没有 ?: 运算符

Go语言中没有?:的原因是该语言的设计者已经看到该操作被频繁地用于创建难以理解的复杂表达式。if-else 形式虽然更长,但无疑更清晰。一种语言只需要一个条件控制流构造。

Go 的一句谚语:清晰胜于聪明

所以不要为此而苦苦挣扎。就这样写吧:

if index < len(arr)-1 {
    if _, ok := arr[index+1][key]; ok {
        //...
    }
}

关于你正在迭代列表,也许最好这样写:

// assumes arr has at least 1 items
for index := range arr[0 : len(arr)-1] {
    if _, ok := arr[index+1][key]; ok {
        //...
    }
}

评论

0赞 iggy12345 7/19/2023
我很害怕这个,但我同意,我认为这不值得为之奋斗。我只是好奇是否存在一些解决方法。我还是 Golang 的新手,所以我还不太了解这门语言的所有复杂性