我正在使用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)
}
有什么办法可以解决这种情况?
谢谢,
沙申克
答案 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)
}
}