我正在使用 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 hashname fieldname
上面返回一个字符串化的 JSON。
现在“过滤器”键可以是基于类型的数组或映射(这就是为什么我将过滤器类型定义为结构中的接口(interface))。
我将 JSON 编码如下:
var p Person
content, err := redis.HGet("hashName", "id").Result()
_ = json.Unmarshal([]byte(content), &p)
现在我必须像下面这样遍历过滤器,但这会导致错误cannot range over p.Filters (type interface {})(我明白为什么会出现这个错误来了)
for _, filter := range p.Filters {
fmt.Println(filter)
}
我们有什么办法可以处理这种情况吗?
谢谢,
沙山
最佳答案
您需要将 Filters
类型 interface{}
转换为预期的 slice 。如果您真的不知道它将是什么类型,您可以使用 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)
}
}
关于json - Go 语言 Redis : Map & Slice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53342831/