【问题标题】:Store struct as string in redis将结构存储为redis中的字符串
【发布时间】:2015-07-27 06:41:15
【问题描述】:

由于 Redis 只存储字符串,我想知道如何使用 Go 将 Struct 转换为字符串来执行相当于 Javascript 的 JSON.stringify 的操作。

我尝试过类型转换:

string(the_struct)

但这会导致错误。

【问题讨论】:

  • 您可以使用Hashes将对象存储在redis中。

标签: json string struct go


【解决方案1】:

encoding/json 包可用于轻松地将 struct 转换为 JSON 字符串,反之亦然(将 JSON 字符串解析为 struct)。

简单示例(在Go Playground 上试用):

type Person struct {
    Name string
    Age  int
}

func main() {
    p := Person{"Bob", 23}

    // Struct -> JSON
    data, err := json.Marshal(&p)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(data))

    // JSON -> JSON
    var p2 Person
    err = json.Unmarshal(data, &p2)
    if err != nil {
        panic(err)
    }
    fmt.Printf("%+v", p2)
}

输出:

{"Name":"Bob","Age":23}
{Name:Bob Age:23}

注意事项:

struct 的字段必须导出(以大写字母开头),否则json 包(使用反射)将无法读取/写入它们。

您还可以为结构字段指定标签以控制/微调 json 编组/解组过程,例如更改 JSON 文本中的名称:

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"years"`
}

通过此更改,上述应用程序的输出如下:

{"name":"Bob","years":23}
{Name:Bob Age:23}

json.Marshal() 函数的文档详细说明了标签提供的可能性。

通过实现json.Marshalerjson.Unmarshaler 接口,您可以完全自定义编组/解组过程。

此外,如果您的结构不是预定义的(例如,您事先不知道字段),您可以使用map[string]interface{}See this answer for details and examples.

【讨论】:

  • @tommyd456 是一个字节切片([]byte),基本上是string表示的UTF-8编码数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 2017-08-26
  • 1970-01-01
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多