猿问

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

我有一个名为 mapped 的 map[string]interface{}:

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 {

所以用简单的英语来说,“如果映射有列或行键,则分配给变量 columnsOrRows”


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


哈士奇WWW
浏览 111回答 2
2回答

互换的青春

测试两个键: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)        }    }}

慕田峪9158850

我不得不进行更广泛的检查。检查地图中是否存在任何可能的键(超过 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"] = trueif AnyKeyInMap([]string{"rows", "columns"}, mapped) {    fmt.Println("exists")}你可以在这里玩: https ://play.golang.org/p/pz64YidEGMK
随时随地看视频慕课网APP

相关分类

Go
我要回答