emahiro/b.log

Drastically Repeat Yourself !!!!

go-redis で custom struct を set / get するときは BinaryMarshaler を実装する必要がある

Overview

以下に記載されてる内容のことです。

github.com

go-redis を使って redis に値を set & get するときは encoding#BinaryMarshaler を実装する必要があるという話です。

Sample

type X struct {}

func Set (key string, x X) error {
    opt := redis.Options{
        // option setting
    }
    client := redis.NewClient(&opt)
    return client.Set(key, x, -1)
}

これだと Setを Call するときに redis: can't marshal X(implement encoding.BinaryMarshaler... というエラーが発生します。
カスタム struct を定義するときは encoding.BinaryMarshaler を実装することを求められるので以下のようにします。

type X struct {}

func (x X) MarshalBinary() ([]byte, error) {
    return json.Marshal(r)
}

func (x X) UnmarshalBinary(data []byte) error {
    return json.Unmarshal(data, &r)
}

func Set (key string, x X) error {
    opt := redis.Options{
        // option setting
    }
    client := redis.NewClient(&opt)
    return client.Set(key, x, -1)
}