在map [string] interface {}

时间:2019-01-16 17:30:40

标签: go

我有一个称为映射的map [string]接口{}:

mapped map[stringinterface{}

我要遍历它,检查是否存在以下两个键之一:

然后,如果是这样,我想将行或列追加到称为:的字符串切片上

  • columnOrRowArray

我了解,如果仅需要在映射内查找列,例如,我可以这样做:

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”

很明显,我知道该语法是错误的,但是我找不到有人这样做的例子

2 个答案:

答案 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