2017-06-27 93 views
0

将文档插入到redis中时出现问题。如何在Golang中将数组文件设置为redis?

我有数据的结构中去:

type ArticleCovers struct { 
    ID    int 
    Covers   ArticleCovers 
    ArticleTypeID int 
    Address  Address  `gorm:"ForeignKey:AddressID"` 
} 

我想这样的数据添加到Redis的:

[ID:1 Cover:[http://chuabuuminh.vn/UserImages/2012/12/10/1/chinh_dien_jpg.jpg] ArticleTypeID:1 Address:map[Street: City:<nil> District:<nil> DistrictID:0 ID:0 Slug: Lat:0 Long:0 Ward:<nil> WardID:0 CityID:0]] 

但是当我运行Redis.HMSet("test", structs.Map(ret))它返回错误:redis: can't marshal postgresql.ArticleCovers (consider implementing encoding.BinaryMarshaler)

谁能帮助我解决我的问题,这么多!

回答

1

像错误消息说,您需要实现BinaryMarshaler界面为你ArticleCovers类型:

type ArticleCovers struct { 
    ID    int 
    Covers   ArticleCovers 
    ArticleTypeID int 
    Address  Address  `gorm:"ForeignKey:AddressID"` 
} 

func (ac ArticleCovers) MarshalBinary() ([]byte, error) { 
    return []byte(fmt.Sprintf("%v-%v", ac.ID, ac.ArticleTypeID)), nil 
} 

请注意,这只是增加了IDArticleTypeID领域。我不知道是什么 的ArticleCoversAddress类型的模样,但往往要拨打 上同样的方法:

func (ac ArticleCovers) MarshalBinary() ([]byte, error) { 
    covers, err := ac.Covers.MarshalBinary() 
    if err != nil { 
     return nil, err 
    } 
    address, err := ac.Address.MarshalBinary() 
    if err != nil { 
     return nil, err 
    } 

    return []byte(fmt.Sprintf("%v-%v-%v-%v", 
     ac.ID, ac.ArticleTypeID, covers, address) 
} 

我不知道这种格式有意义的数据。您可能想要使用定义的编码格式(如json) 。

您可能还想要实现BinaryUnmarshaler接口。 这样做是作为一个练习;-)

0

由于Carpetsmoker在说关于JSON编码,这是如何做到这一点:

func (ac ArticleCovers) MarshalBinary() ([]byte, error) { 
    return json.Marshal(ac) 
} 

凡解码时你会使用BinaryUnmarshaler

你可以在我的blog post

这里查看更好的示例
相关问题