cacheに乗せたい時やちょっとしたものを作るときには簡単にシリアライズ/デシリアライズできる
パッケージがあると便利だ.
gobパッケージを使うと簡単にできるようだ.
rpc向けのパッケージらしい.
他ではencoding/jsonやencoding/xmlだろうか.ここら辺はググればすぐ出ると思う.
encoding/binaryも使い道によっては良いと思う.
それでもgobを使ってみたのはgobの方が早いとの記述を何処かで見たからだ.(が,測定はしていない)
使い方は絶対忘れるので作ったサンプルを書いておく.
package main
import (
"bytes"
"time"
"fmt"
"encoding/gob"
)
type Entry struct {
ID int64 `datastore:"-"`
Title string
Contents string
CreateAt time.Time
UpdateAt time.Time
DeleteAt time.Time
}
func (e *Entry) GobEncode() ([]byte, error) {
w := new(bytes.Buffer)
encoder := gob.NewEncoder(w)
if err := encoder.Encode(e.ID); err != nil {
return nil, err
}
if err := encoder.Encode(e.Title); err != nil {
return nil, err
}
if err := encoder.Encode(e.Contents); err != nil {
return nil, err
}
if err := encoder.Encode(e.CreateAt); err != nil {
return nil, err
}
if err := encoder.Encode(e.UpdateAt); err != nil {
return nil, err
}
if err := encoder.Encode(e.DeleteAt); err != nil {
return nil, err
}
return w.Bytes(), nil
}
func (e *Entry) GobDecode(buf []byte) error {
r := bytes.NewBuffer(buf)
decoder := gob.NewDecoder(r)
if err := decoder.Decode(&e.ID); err != nil {
return err
}
if err := decoder.Decode(&e.Title); err != nil {
return err
}
if err := decoder.Decode(&e.Contents); err != nil {
return err
}
if err := decoder.Decode(&e.CreateAt); err != nil {
return err
}
if err := decoder.Decode(&e.UpdateAt); err != nil {
return err
}
if err := decoder.Decode(&e.DeleteAt); err != nil {
return err
}
return nil
}
func main() {
e1 := &Entry{
ID: 1,
Title: "title",
Contents: "contents",
CreateAt: time.Now(),
UpdateAt: time.Now(),
DeleteAt: time.Now(),
}
b, err := e1.GobEncode()
if err != nil {
fmt.Println("Error occured.", err)
}
e2 := &Entry{}
if err = e2.GobDecode(b); err != nil {
fmt.Println("Error occured.", err)
}
fmt.Println(e2.ID)
fmt.Println(e2.Title)
fmt.Println(e2.Contents)
fmt.Println(e2.CreateAt)
fmt.Println(e2.UpdateAt)
fmt.Println(e2.DeleteAt)
}
コメントも書いたし,多分思い出せるだろう.