GoLang Redis : Map & Slice



我使用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哈希名称字段名称

Above返回一个字符串化的JSON。

现在,"filters"键可以是基于类型的数组或映射(这就是为什么我在结构中将filters类型定义为接口(
我整理JSON如下:

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

现在我必须循环下面的过滤器,但这给出了无法在p范围内的错误。过滤器(类型接口{}((我理解为什么会出现这个错误(

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

我们有办法处理这种情况吗?

谢谢,
Shashank

您需要将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("%Tn", i)
}
}

最新更新