GoLang Redis:地图和切片

时间:2018-11-16 17:38:38

标签: json go redis

我正在使用GoLang从redis哈希中获取数据,然后映射到结构中。

type Person struct {
    ID         string       `json:"id"`
    FirstName  string       `json:"firstName"`
    LastName   string       `json:"lastName"`
    Filters    interface{}  `json:"filters"`
    Type       string       `json:"type"`
}

在Redis中,哈希字段包含一个字符串化的JSON。

  

HGET哈希名称字段名

上面返回一个字符串化的JSON。

现在“过滤器”键可以基于类型为数组或映射(这就是为什么我将过滤器类型定义为struct中的接口的原因。)
我将JSON编组如下:

var p Person
content, err := redis.HGet("hashName", "id").Result()
_ = json.Unmarshal([]byte(content), &p)

现在,我必须像下面那样遍历过滤器,但这会给出错误, 不能覆盖p.Filters(类型为接口{}) (我理解为什么会出现此错误来了

for _, filter := range p.Filters {
  fmt.Println(filter)
}

有什么办法可以解决这种情况?

谢谢,
沙申克

1 个答案:

答案 0 :(得分:1)

您需要将Filters类型interface{}转换为期望的切片。如果您真的不知道它将是哪种类型,可以使用map[string]interface{}。因此,将您的Filters类型更改为map[string]interface{}

更多信息 如果Filters可以是数组(也可以不是),那么您可以考虑使用type switch

一个简单的例子:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    var i interface{}
    //json.Unmarshal([]byte(`["hi"]`), &i)
    json.Unmarshal([]byte(`{"a":"hi"}`), &i)

    switch i.(type) {
    case []interface{}:
        println("ARRAY")
    case map[string]interface{}:
        println("NOT ARRAY")
    default:
        fmt.Printf("%T\n", i)
    }
}