go操作redis序列化和反序列化中gob包采坑

ccc1073 · · 1853 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

一般使用比较复杂的结构体嵌套时 不能直接使用hash存进redis 一般使用gob包转成二进制或者json存入redis 今天自己写了个demo测试 发现一直取不到数据 打印出来是个空的结构体 不多说上代码 ```go type Person struct { name string age int fans []string frinend map[int]string } func main() { conn,err := redis.Dial("tcp",":6379") if err != nil{ println("连接错误") return } defer conn.Close() a:=&Person{Name:"tong",Age:20,Fans:[]string{"g","s","3"},Frinend: map[int]string{1:"a",2:"b"}} //var t []Person //t= append(t, *a) var buffer bytes.Buffer enc:=gob.NewEncoder(&buffer) // 获取编码器 enc.Encode(a) // 编码 fmt.Println(a) conn.Do("set","1111",buffer.Bytes()) // 获取数据 rep,err:=conn.Do("get","1111") data,_:=redis.Bytes(rep,err) // 解码 doc:=gob.NewDecoder(bytes.NewReader(data)) //获取解码器 b:=&Person{} doc.Decode(b) // 解码操作 fmt.Println(b) if err !=nil{ fmt.Println(err) return }``` 一直找不到原因 后来打印了一下Encode()返回的err gob: type main.Person has no exported fields 才发现 原来是 结构体定义的成员都是小写造成的!!! 也就是Person没有可导出的属性因为小写的话是私有的 外部包是不能访问的 注意在go里一定要按规则命名!!!!! 用惯了python都是泪 T_T 改成 大写的 `type Person struct { Name string Age int Fans []string Frinend map[int]string } ` 即可 再次运行获得正确的数据

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1853 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传