登录
首页 >  Golang >  Go问答

在一个条件下检查键是否存在于多个映射中

来源:Golang技术栈

时间:2023-04-06 06:50:27 285浏览 收藏

知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个Golang开发实战,手把手教大家学习《在一个条件下检查键是否存在于多个映射中》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!

问题内容

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

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

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

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

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

正确答案

不,这做不到。规范:索引表达式:

在特殊形式的赋值或初始化中map[K]V使用的映射 a 上的索引表达式

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

产生一个额外的无类型布尔值。的值oktrue如果键x存在于地图中,否则为假。

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上的示例。

到这里,我们也就讲完了《在一个条件下检查键是否存在于多个映射中》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于golang的知识点!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>