登录
首页 >  Golang >  Go问答

GoLang Redis:地图和切片

来源:stackoverflow

时间:2024-04-06 14:30:37 446浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《GoLang 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。

现在“filters”键可以是基于类型的数组或映射(这就是我将 filters 类型定义为结构中的接口的原因)。

我将 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)
}

有什么办法可以处理这种情况吗?

谢谢

沙申克


解决方案


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

根据更多信息 如果 filters 可以是数组(或不是数组),那么您可以考虑使用 type 开关

一个简单的例子:

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)
    }
}

终于介绍完啦!小伙伴们,这篇关于《GoLang Redis:地图和切片》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>