【问题标题】:Change bytes array to struct in golang在golang中将字节数组更改为结构
【发布时间】:2019-08-03 16:19:42
【问题描述】:

我在 redis 中有一些数据。 该值以字节的形式存储。 我想获取字节并将其映射到结构,但我无法解码字节数据。 这是我用来将数据持久化到 redis 的代码:

    import (
    bytes "bytes"
    "encoding/gob"
    "fmt"
    "github.com/go-redis/redis"
    "time"
)

var convertor bytes.Buffer
var encoder = gob.NewEncoder(&convertor)
var decoder = gob.NewDecoder(&convertor)

func Set(field string,  value interface{}) (error){
    id := "sample-key";
    err := encoder.Encode(value)
    if err!=nil {
        fmt.Printf("error occured while marshaling data")
        return err;
    }

    valueBytes := convertor.Bytes()

    err = redisdb.HSet(id, field, valueBytes).Err();
    if err!=nil{
        fmt.Printf("error occured while setting data")
        return err;
    }
    return nil;
}

这就是我从 redis 获取数据的方式:

result, err := redisdb.HGet(key, field).Result()
if err != nil{
    fmt.Println("error occured");
}

但我无法将其存储到结构中。如何将字节数据解码为结构?

【问题讨论】:

  • 你遇到了什么错误?

标签: go redis encode


【解决方案1】:

在编码操作之间重用 bytes.Buffer 会产生意想不到的结果。每次调用 Encode 都会将数据附加到缓冲区。多次调用 Set 会将以下数据写入数据库:(value1)、(value1, value2)、(value1, value2, value3) 等等。同时调用该函数会造成数据竞争。

通过为每次调用函数创建缓冲区和编码器来修复 Set 函数:

func Set(field string, value interface{}) error {
    var buf bytes.Buffer
    var encoder = gob.NewEncoder(&buf)

    id := "sample-key"
    err := encoder.Encode(value)
    if err != nil {
        return err
    }
    return redisdb.HSet(id, field, buf.Bytes()).Err()
}

Get 函数是 set 函数的逆函数:

func Get(field string, value interface{}) error {
    id := "sample-key"
    buf, err := redisdb.HGet(id, field).Bytes()
    if err != nil {
        return err
    }
    return gob.NewDecoder(bytes.NewReader(buf)).Decode(value)
}

使用指向值的指针调用 get 函数:

var d Data
err := Get(field, &d)

【讨论】:

    【解决方案2】:

    一个简单的 JSON.Unmarshal(the bytes object, the struct variable) 就足够了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      相关资源
      最近更新 更多