我有一个称为映射的map [string]接口{}:
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 {
因此,用简单的英语来说,“如果映射的对象具有列或行键,则将其分配给变量columnOrRows”
很明显,我知道该语法是错误的,但是我找不到有人这样做的例子
答案 0 :(得分:3)
测试两个键:
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)
}
}
}
答案 1 :(得分:1)
我必须进行更广泛的检查。检查地图中是否存在任何可能的键(大于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