package main
import (
"fmt"
"bytes"
"encoding/gob"
"github.com/go-redis/redis"
//"strings"
"unsafe"
)
type serialize struct {
network bytes.Buffer
//任意数据类型
val interface{}
}
//序列化 注意修改原始数据类型
func (x *serialize) Xencode(val interface{}) {
// 1.创建编码器
enc := gob.NewEncoder(&x.network)
// 2.向编码器中写入数据
err := enc.Encode(val)
if err != nil {
fmt.Println("序列化失败")
}
}
//反序列化
func (x *serialize) Xdecode(val []byte) {
decoder := gob.NewDecoder(bytes.NewReader(val)) //创建解密器
err2 := decoder.Decode(&x.val) //解密
if err2 != nil {
fmt.Println("反序列化失败")
}
}
// 声明一个全局的rdb变量
var rdb *redis.Client
// 初始化连接
func initClient() (err error) {
rdb = redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password set
DB: 0, // use default DB
})
_, err = rdb.Ping().Result()
if err != nil {
return err
}
return nil
}
//高效的数据转换
func strbyte(s string) []byte {
x := (*[2]uintptr)(unsafe.Pointer(&s))
h := [3]uintptr{x[0], x[1], x[1]}
return *(*[]byte)(unsafe.Pointer(&h))
}
//高效的数据转换
func bytestr(b []byte) string {
return *(*string)(unsafe.Pointer(&b))
}
func main() {
var countryCapitalMap map[string]string /*创建集合 */
countryCapitalMap = make(map[string]string)
/* map插入key - value对,各个国家对应的首都 */
countryCapitalMap["France"] = "巴黎"
countryCapitalMap["Italy"] = "罗马"
countryCapitalMap["Japan"] = "东京"
countryCapitalMap["India "] = "新德里"
fmt.Println("原数据-", countryCapitalMap)
var code serialize
code.Xencode(countryCapitalMap)
fmt.Println("序列化-", code.network.Bytes())
//连接redis
initClient()
//存入redis数据类型[]type可以存入
err := rdb.Set("val", code.network.Bytes(), 0).Err()
if err != nil {
fmt.Printf("set val failed, err:%v\n", err)
return
}
//返回类型可变
val, err := rdb.Get("val").Bytes()
if err != nil {
fmt.Printf("get val failed, err:%v\n", err)
return
}
fmt.Println("val=>", val)
code.Xdecode(val)
//code.Xdecode(strbyte(val))
fmt.Println("反序列化-", code.val)
}