2017-06-27 41 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

這裏查看更好的示例
相關問題