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

Go 在map[string]接口{}中检查多个键时使用OR逻辑,go,Go,我有一个map[string]接口{},名为mapped: mapped map[stringinterface{} 我想对其进行迭代,检查是否存在以下任一键: 纵队 排 如果是这样,我想将行或列附加到一个称为: 列阵 我明白,如果我只需要在mapped中查找(例如列),我可以这样做: var columnOrRowArray []string if columnsOrRows, ok := mapped["columns"].([]interface{}); ok { fo

我有一个map[string]接口{},名为mapped:

mapped map[stringinterface{}
我想对其进行迭代,检查是否存在以下任一键:

  • 纵队
如果是这样,我想将行或列附加到一个称为:

  • 列阵
我明白,如果我只需要在mapped中查找(例如列),我可以这样做:

var columnOrRowArray []string

if 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 {
因此,简单地说,“如果映射有列或行键,则将其指定给变量columns”

显然,我知道这句话的语法是错误的,但我找不到有人对这两个键进行测试的例子:

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)
        }
    }
}

我不得不进行更广泛的检查。检查地图中是否存在任何可能的键(多于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")
}
你可以在这里玩:

相关的/可能的重复。是吗?我在看同一张地图