Go 在map[string]接口{}中检查多个键时使用OR逻辑
我有一个map[string]接口{},名为mapped:Go 在map[string]接口{}中检查多个键时使用OR逻辑,go,Go,我有一个map[string]接口{},名为mapped: mapped map[stringinterface{} 我想对其进行迭代,检查是否存在以下任一键: 纵队 排 如果是这样,我想将行或列附加到一个称为: 列阵 我明白,如果我只需要在mapped中查找(例如列),我可以这样做: var columnOrRowArray []string if columnsOrRows, ok := mapped["columns"].([]interface{}); ok { fo
mapped map[stringinterface{}
我想对其进行迭代,检查是否存在以下任一键:
- 纵队
- 排
- 列阵
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")
}
你可以在这里玩:
相关的/可能的重复。是吗?我在看同一张地图