为了账号安全,请及时绑定邮箱和手机立即绑定

在 map[string]interface{} 中检查多个键时使用 OR 逻辑

在 map[string]interface{} 中检查多个键时使用 OR 逻辑

Go
哈士奇WWW 2023-06-01 16:22:59
我有一个名为 mapped 的 map[string]interface{}:mapped map[stringinterface{}我想遍历它检查是否存在这些键中的任何一个:列行如果是这样,我想将行或列附加到一段名为:列或行数组我知道如果我只需要在映射中查找例如列,我可以这样做:var columnOrRowArray []stringif columnsOrRows, ok := mapped["columns"].([]interface{}); ok {    for _, columnOrRow := range columnsOrRows {        if columnOrRowValueIsString, ok = columnOrRow.(string); ok {            columnOrRowArray = append(columnOrRowArray, columnOrRowValueIsString)        }    }}如果我不重复上面的使用映射[“行”]的行逻辑的方法,那将是一种干净的方法?我想做一些基本上是这样的事情:columnsOrRows, ok := mapped["columns"].([]interface{}) || mapped["rows"].([]interface{}); ok {所以用简单的英语来说,“如果映射有列或行键,则分配给变量 columnsOrRows”显然我知道语法是错误的,但我找不到有人这样做的例子
查看完整描述

2 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

测试两个键:


columnsOrRows, ok := mapped["columns"].([]interface{})

if !ok {

    columnsOrRows, ok = mapped["rows"].([]interface{})

}


if ok {

    for _, columnOrRow := range columnsOrRows {

        if columnOrRowValueIsString, ok = columnOrRow.(string); ok {

            columnOrRowArray = append(columnOrRowArray, columnOrRowValueIsString)

        }

    }

}


查看完整回答
反对 回复 2023-06-01
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

我不得不进行更广泛的检查。检查地图中是否存在任何可能的键(超过 2 个)。最后编写了一个实用函数来完成任务并使代码保持可读性。


func StringInSlice(s string, list []string) bool {

    for _, item := range list {

        if item == s {

            return true

        }

    }

    return false

}


func AnyKeyInMap(keys []string, keyMap map[string]interface{}) bool {

    for k := range keyMap {

        if StringInSlice(k, keys) {

            return true

        }

    }

    return false

}

用法是:


mapped := make(map[string]interface{})

mapped["rows"] = true

if AnyKeyInMap([]string{"rows", "columns"}, mapped) {

    fmt.Println("exists")

}

你可以在这里玩: https ://play.golang.org/p/pz64YidEGMK


查看完整回答
反对 回复 2023-06-01
  • 2 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信