在 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
)就足够了!
我在 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
)就足够了!