2017-06-27 4 views
0

Ich habe ein Problem, wenn Dokument in Redis einfügen.Wie setze ich Array-Dokumente in Goland in Redisis?

Ich habe eine Struktur von Daten in Go:

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

ich Daten wie diese in Redis hinzufügen möchten:

[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]] 

Aber wenn ich Redis.HMSet("test", structs.Map(ret)) laufen sie den Fehler zurück: redis: can't marshal postgresql.ArticleCovers (consider implementing encoding.BinaryMarshaler).

Wer kann mir helfen, mein Problem zu beheben, thks Sie so sehr!

Antwort

1

Wie die Fehlermeldung sagt, müssen Sie die BinaryMarshaler Schnittstelle für Ihre ArticleCovers Typ implementieren:

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 
} 

Beachten Sie, dass dies trägt nur die ID und ArticleTypeID Felder aus. Ich weiß nicht, was die ArticleCovers und Address Typen aussehen, aber oft wollen Sie die gleichen Methoden an, dass nennen:

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) 
} 

Ich weiß nicht, ob das Format sinnvoll für Ihre Daten macht. Möglicherweise möchten Sie ein definiertes Kodierungsformat wie JSON verwenden.

Sie werden wahrscheinlich auch die BinaryUnmarshaler Schnittstelle implementieren möchten. zu tun, die sich als Übung ;-)

0

Als Carpetsmoker dies ist über die JSON-Codierung zu sagen war, wie es geht:

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

Wo beim Dekodieren Sie BinaryUnmarshaler

Sie verwenden würden Dose Kasse für besseres Beispiel hier bei meinem blog post