当前位置: 首页 > 面试题库 >

在一种情况下检查密钥是否存在于多个地图中

司寇飞航
2023-03-14
问题内容

我需要检查两个地图中是否存在相同的键:

if v1, ok1 := map1["aaa"]; ok1 {
 ...
}
if v2, ok2 := map2["aaa"]; ok2 {
 ...
}

是否可以将这两个条件合而为一?我设法做这样的事情:

v1, ok1 := map1["aaa"]
v2, ok2 := map2["aaa"]
if ok1 && ok2 {
 ...
}

但我很好奇它是否可以在一种if情况下完成(分配和检查)。


问题答案:

不,这是不可能的。规格:索引表达式:

地图a上的索引表达式,其类型map[K]V用于特殊形式的赋值或初始化

v, ok = a[x]
v, ok := a[x]
var v, ok = a[x]

产生另一个无类型的布尔值。的值oktruex是否存在于映射中,否则为false。

因此,v, ok := m[k]只有在没有其他分配的情况下,才可以使用特殊形式。

但是,如果不使用映射的值类型的零值,则可以使用简单的元组分配进行检查;通过不使用特殊形式而是使用2个简单的索引表达式。

例如,如果您的值类型是某种接口类型(例如interface{}),并且您知道不使用该nil值,则可以执行以下操作:

if v1, v2 := m1["aaa"], m2["aaa"]; v1 != nil && v2 != nil {
    fmt.Printf("Both map contains key '%s': %v, %v\n", "aaa", v1, v2)
}

当然,有了一个辅助功能,您可以一步完成:

func idx(m1, m2 map[string]interface{}, k string) (
    v1, v2 interface{}, ok1, ok2 bool) {

    v1, ok1 = m1[k]
    v2, ok2 = m2[k]
    return
}

使用它:

if v1, v2, ok1, ok2 := idx(m1, m2, "aaa"); ok1 && ok2 {
    fmt.Printf("Both map contains key '%s': %v, %v\n", "aaa", v1, v2)
}

在Go Playground上尝试示例。



 类似资料:
  • 问题内容: 我知道我可以在地图迭代的, 并寻找钥匙,但是有没有更有效的方法来测试地图中钥匙的存在? 我在语言规范中找不到答案。 问题答案: 一线回答: 说明: Go中的语句可以同时包含条件和初始化语句。上面的示例同时使用: 初始化两个变量- 将从映射中接收“ foo”的值或从“零值”(在这种情况下为空字符串)接收值,并且将收到一个布尔值,如果在映射中实际存在“ foo” ,则该布尔值将设置为 计算

  • 所以,我从服务器上获得了一些JSON值,但我不知道是否会有一个特定的字段。 比如: 有时,会有一个额外的字段,如: 我想检查名为“club”的字段是否存在,这样在解析时我就不会得到 组织。json。JSONException:俱乐部没有价值

  • 问题内容: 我陷入一种情况,我需要检查嵌套JSON对象中是否存在密钥。通过嵌套的JSON对象,我在父JSON对象中具有一个JSON对象作为其键之一的值。所以我需要检查此密钥是否存在于整个JSON对象中。我将以下数据作为对象。我知道我可以解析此对象以获得JSON对象。 我已经使用方法来检查主要JSON对象中密钥的存在,并且它可以工作。但是对于检查任何内部JSON对象(例如“ info”),我需要再次

  • 我不熟悉shell脚本,我有一个用于导入cert和使用keytool导入keystore的脚本。此脚本位于Pod中,有时我必须重新启动Pod,有时当此脚本运行时,我会出现此错误 现有条目别名服务器存在,覆盖?[no]:输入新别名(返回以取消此条目的导入): 我知道有命令列出别名 它给出了输出 服务器,2022年6月22日,PrivateKeyEntry,证书指纹(SHA-256):AC:DC:12

  • 我遇到了这个PHP代码使用SMTP检查电子邮件地址而不发送电子邮件。 有没有人尝试过类似的方法,或者对你有用吗?你能判断客户/用户输入的电子邮件是否正确和是否存在吗?

  • 问题内容: 我是NodeJS的新手,也许没有事件系统应该如何工作。找不到错误。请指教。我需要一个简单的任务- 检查标签,如果它不存在,则设置新密钥和有关该标签的信息。问题是-然后我第一次运行该脚本,它始终返回“键不存在”。检查redisdb键- 它会创建很多标签这是我的代码 这是另一个例子 输出: 看起来nodejs仅在该“设置”命令之后执行所有“获取”命令。所以…我了解,这全都归因于异步操作。但