msgpack-go is a MessagePack implementation for the Go programming language.
To encode values into the binary MessagePack format, an Encode
function is provided:
func Encode(w io.Writer, v Encoder) error
Encoder
describes an encodable type which fulfills the interface
type Encoder interface {
EncodeMsgpack(w *Writer) error
}
and writes its value to the given writer. The Writer
type provides a Write*
method for each supported data type. For a complete overview of the Writer
type, see the documentation.
To decode binary MessagePack data into values, a Decode
function is provided:
func Decode(r io.Reader, v Decoder) error
Decoder
describes a decodable type which fulfills the interface
type Decoder interface {
DecodeMsgpack(r *Reader) error
}
and reads the necessary values from the given reader. The Reader
type provides a Read*
method for each supported data type. Furthermore, a reader provides the following extra methods:
- Peek for looking up the next type in the stream without moving the read pointer, and
- Skip for skipping any value which comes next in the stream.
For a complete overview of the Reader
type, see the documentation.
package main
import (
"bytes"
"log"
msgpack "github.com/mprot/msgpack-go"
)
type Custom struct {
Number int
Boolean bool
}
func (c *Custom) EncodeMsgpack(w *msgpack.Writer) error {
if err := w.WriteInt(c.Number); err != nil {
return err
}
return w.WriteBool(c.Boolean)
}
func (c *Custom) DecodeMsgpack(r *msgpack.Reader) (err error) {
if c.Number, err = r.ReadInt(); err != nil {
return err
}
c.Boolean, err = r.ReadBool()
return err
}
func main() {
var buf bytes.Buffer
encoded := &Custom{Number: 7, Boolean: true}
if err := msgpack.Encode(&buf, encoded); err != nil {
log.Fatal(err)
}
decoded := &Custom{}
if err := msgpack.Decode(&buf, decoded); err != nil {
log.Fatal(err)
}
if decoded.Number != encoded.Number || decoded.Boolean != encoded.Boolean {
log.Fatal("something went wrong")
}
}