在 golang 中将字节数组更改为结构

Change bytes array to struct in golang

我在 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");
}

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

在编码操作之间重复使用 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)

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