一般使用比较复杂的结构体嵌套时 不能直接使用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
} `
即可 再次运行获得正确的数据
有疑问加站长微信联系(非本文作者)