msgpack package - github.com/vmihailenco/msgpack/v5 - Go Packages

This section is empty.

This section is empty.

Marshal returns the MessagePack encoding of v.

type Item struct {
	Foo string
}

b, err := msgpack.Marshal(&Item{Foo: "bar"})
if err != nil {
	panic(err)
}

var item Item
err = msgpack.Unmarshal(b, &item)
if err != nil {
	panic(err)
}
fmt.Println(item.Foo)
Output:

bar
type Item struct {
	_msgpack struct{} `msgpack:",as_array"`
	Foo      string
	Bar      string
}

var buf bytes.Buffer
enc := msgpack.NewEncoder(&buf)
err := enc.Encode(&Item{Foo: "foo", Bar: "bar"})
if err != nil {
	panic(err)
}

dec := msgpack.NewDecoder(&buf)
v, err := dec.DecodeInterface()
if err != nil {
	panic(err)
}
fmt.Println(v)
Output:

[foo bar]
og := map[string]interface{}{
	"something:special": uint(123),
	"hello, world":      "hello!",
}
raw, err := msgpack.Marshal(og)
if err != nil {
	panic(err)
}

type Item struct {
	SomethingSpecial uint   `msgpack:"'something:special'"`
	HelloWorld       string `msgpack:"'hello, world'"`
}
var item Item
if err := msgpack.Unmarshal(raw, &item); err != nil {
	panic(err)
}
fmt.Printf("%#v\n", item)
Output:

msgpack_test.Item{SomethingSpecial:0x7b, HelloWorld:"hello!"}
var t1 T
raw, err := msgpack.Marshal(t1)
if err != nil {
	panic(err)
}
var t2 T
if err = msgpack.Unmarshal(raw, &t2); err != nil {
	panic(err)
}
fmt.Printf("%#v\n", t2)

t2.I.Set(42)
t2.S.hidden = true // won't be included because it is a hidden field
raw, err = msgpack.Marshal(t2)
if err != nil {
	panic(err)
}
var t3 T
if err = msgpack.Unmarshal(raw, &t3); err != nil {
	panic(err)
}
fmt.Printf("%#v\n", t3)
Output:

msgpack_test.T{I:msgpack_test.NullInt{Valid:false, Int:0}, J:msgpack_test.NullInt{Valid:true, Int:0}, S:msgpack_test.Secretive{Visible:false, hidden:false}}
msgpack_test.T{I:msgpack_test.NullInt{Valid:true, Int:42}, J:msgpack_test.NullInt{Valid:true, Int:0}, S:msgpack_test.Secretive{Visible:false, hidden:false}}
in := map[string]interface{}{"foo": 1, "hello": "world"}
b, err := msgpack.Marshal(in)
if err != nil {
	panic(err)
}

var out map[string]interface{}
err = msgpack.Unmarshal(b, &out)
if err != nil {
	panic(err)
}

fmt.Println("foo =", out["foo"])
fmt.Println("hello =", out["hello"])
Output:

foo = 1
hello = world
type Item struct {
	Foo string
	Bar string
}

item := &Item{
	Foo: "hello",
}
b, err := msgpack.Marshal(item)
if err != nil {
	panic(err)
}
fmt.Printf("item: %q\n", b)

type ItemOmitEmpty struct {
	_msgpack struct{} `msgpack:",omitempty"`
	Foo      string
	Bar      string
}

itemOmitEmpty := &ItemOmitEmpty{
	Foo: "hello",
}
b, err = msgpack.Marshal(itemOmitEmpty)
if err != nil {
	panic(err)
}
fmt.Printf("item2: %q\n", b)
Output:

item: "\x82\xa3Foo\xa5hello\xa3Bar\xa0"
item2: "\x81\xa3Foo\xa5hello"
func PutDecoder(dec *Decoder)
func PutEncoder(enc *Encoder)
func Register(value interface{}, enc encoderFunc, dec decoderFunc)

Register registers encoder and decoder functions for a value. This is low level API and in most cases you should prefer implementing CustomEncoder/CustomDecoder or Marshaler/Unmarshaler interfaces.

func RegisterExt(extID int8, value MarshalerUnmarshaler)
t := time.Unix(123456789, 123)

{
	msgpack.RegisterExt(1, (*EventTime)(nil))
	b, err := msgpack.Marshal(&EventTime{t})
	if err != nil {
		panic(err)
	}

	var v interface{}
	err = msgpack.Unmarshal(b, &v)
	if err != nil {
		panic(err)
	}
	fmt.Println(v.(*EventTime).UTC())

	tm := new(EventTime)
	err = msgpack.Unmarshal(b, &tm)
	if err != nil {
		panic(err)
	}
	fmt.Println(tm.UTC())
}

{
	msgpack.RegisterExt(1, (*EventTime)(nil))
	b, err := msgpack.Marshal(&EventTime{t})
	if err != nil {
		panic(err)
	}

	// override ext
	msgpack.RegisterExt(1, (*OneMoreSecondEventTime)(nil))

	var v interface{}
	err = msgpack.Unmarshal(b, &v)
	if err != nil {
		panic(err)
	}
	fmt.Println(v.(*OneMoreSecondEventTime).UTC())
}

{
	msgpack.RegisterExt(1, (*OneMoreSecondEventTime)(nil))
	b, err := msgpack.Marshal(&OneMoreSecondEventTime{
		EventTime{t},
	})
	if err != nil {
		panic(err)
	}

	// override ext
	msgpack.RegisterExt(1, (*EventTime)(nil))
	var v interface{}
	err = msgpack.Unmarshal(b, &v)
	if err != nil {
		panic(err)
	}
	fmt.Println(v.(*EventTime).UTC())
}
Output:

1973-11-29 21:33:09.000000123 +0000 UTC
1973-11-29 21:33:09.000000123 +0000 UTC
1973-11-29 21:33:10.000000123 +0000 UTC
1973-11-29 21:33:10.000000123 +0000 UTC
func Unmarshal(data []byte, v interface{}) error

Unmarshal decodes the MessagePack-encoded data and stores the result in the value pointed to by v.

func UnregisterExt(extID int8)
t := time.Unix(123456789, 123)

{
	msgpack.RegisterExt(1, (*EventTime)(nil))
	b, err := msgpack.Marshal(&EventTime{t})
	if err != nil {
		panic(err)
	}

	msgpack.UnregisterExt(1)

	var v interface{}
	err = msgpack.Unmarshal(b, &v)
	wanted := "msgpack: unknown ext id=1"
	if err.Error() != wanted {
		panic(err)
	}

	msgpack.RegisterExt(1, (*OneMoreSecondEventTime)(nil))
	err = msgpack.Unmarshal(b, &v)
	if err != nil {
		panic(err)
	}
	fmt.Println(v.(*OneMoreSecondEventTime).UTC())
}

{
	msgpack.RegisterExt(1, (*OneMoreSecondEventTime)(nil))
	b, err := msgpack.Marshal(&OneMoreSecondEventTime{
		EventTime{t},
	})
	if err != nil {
		panic(err)
	}

	msgpack.UnregisterExt(1)
	var v interface{}
	err = msgpack.Unmarshal(b, &v)
	wanted := "msgpack: unknown ext id=1"
	if err.Error() != wanted {
		panic(err)
	}

	msgpack.RegisterExt(1, (*EventTime)(nil))
	err = msgpack.Unmarshal(b, &v)
	if err != nil {
		panic(err)
	}
	fmt.Println(v.(*EventTime).UTC())
}
Output:

1973-11-29 21:33:10.000000123 +0000 UTC
1973-11-29 21:33:10.000000123 +0000 UTC

Version is the current release version.

type CustomDecoder interface {
	DecodeMsgpack(*Decoder) error
}
type CustomEncoder interface {
	EncodeMsgpack(*Encoder) error
}
package main

import (
	"fmt"

	"github.com/vmihailenco/msgpack/v5"
)

type customStruct struct {
	S string
	N int
}

var _ msgpack.CustomEncoder = (*customStruct)(nil)
var _ msgpack.CustomDecoder = (*customStruct)(nil)

func (s *customStruct) EncodeMsgpack(enc *msgpack.Encoder) error {
	return enc.EncodeMulti(s.S, s.N)
}

func (s *customStruct) DecodeMsgpack(dec *msgpack.Decoder) error {
	return dec.DecodeMulti(&s.S, &s.N)
}

func main() {
	b, err := msgpack.Marshal(&customStruct{S: "hello", N: 42})
	if err != nil {
		panic(err)
	}

	var v customStruct
	err = msgpack.Unmarshal(b, &v)
	if err != nil {
		panic(err)
	}
	fmt.Printf("%#v", v)
}
Output:

msgpack_test.customStruct{S:"hello", N:42}

A Decoder reads and decodes MessagePack values from an input stream.

func GetDecoder() *Decoder

NewDecoder returns a new decoder that reads from r.

The decoder introduces its own buffering and may read data from r beyond the requested msgpack values. Buffering can be disabled by passing a reader that implements io.ByteScanner interface.

Buffered returns a reader of the data remaining in the Decoder's buffer. The reader is valid until the next call to Decode.

func (d *Decoder) Decode(v interface{}) error

DecodeArrayLen decodes array length. Length is -1 when array is nil.

func (d *Decoder) DecodeExtHeader() (extID int8, extLen int, err error)

DecodeFloat64 decodes msgpack float32/64 into Go float64.

DecodeInt64 decodes msgpack int8/16/32/64 and uint8/16/32/64 into Go int64.

func (d *Decoder) DecodeInterface() (interface{}, error)

DecodeInterface decodes value into interface. It returns following types:

  • nil,
  • bool,
  • int8, int16, int32, int64,
  • uint8, uint16, uint32, uint64,
  • float32 and float64,
  • string,
  • []byte,
  • slices of any of the above,
  • maps of any of the above.

DecodeInterface should be used only when you don't know the type of value you are decoding. For example, if you are decoding number it is better to use DecodeInt64 for negative numbers and DecodeUint64 for positive numbers.

func (d *Decoder) DecodeInterfaceLoose() (interface{}, error)

DecodeInterfaceLoose is like DecodeInterface except that:

  • int8, int16, and int32 are converted to int64,
  • uint8, uint16, and uint32 are converted to uint64,
  • float32 is converted to float64.
  • []byte is converted to string.

DecodeMapLen decodes map length. Length is -1 when map is nil.

func (d *Decoder) DecodeMulti(v ...interface{}) error
func (d *Decoder) DecodeSlice() ([]interface{}, error)
func (d *Decoder) DecodeTypedMap() (interface{}, error)

DecodeTypedMap decodes a typed map. Typed map is a map that has a fixed type for keys and values. Key and value types may be different.

DecodeUint64 decodes msgpack int8/16/32/64 and uint8/16/32/64 into Go uint64.

func (d *Decoder) DecodeUntypedMap() (map[interface{}]interface{}, error)
func (d *Decoder) DisableAllocLimit(on bool)

DisableAllocLimit enables fully allocating slices/maps when the size is known

func (d *Decoder) DisallowUnknownFields(on bool)

DisallowUnknownFields causes the Decoder to return an error when the destination is a struct and the input contains object keys which do not match any non-ignored, exported fields in the destination.

PeekCode returns the next MessagePack code without advancing the reader. Subpackage msgpack/codes defines the list of available msgpcode.

Query extracts data specified by the query from the msgpack stream skipping any other data. Query consists of map keys and array indexes separated with dot, e.g. key1.0.key2.

b, err := msgpack.Marshal([]map[string]interface{}{
	{"id": 1, "attrs": map[string]interface{}{"phone": 12345}},
	{"id": 2, "attrs": map[string]interface{}{"phone": 54321}},
})
if err != nil {
	panic(err)
}

dec := msgpack.NewDecoder(bytes.NewBuffer(b))
values, err := dec.Query("*.attrs.phone")
if err != nil {
	panic(err)
}
fmt.Println("phones are", values)

dec.Reset(bytes.NewBuffer(b))
values, err = dec.Query("1.attrs.phone")
if err != nil {
	panic(err)
}
fmt.Println("2nd phone is", values[0])
Output:

phones are [12345 54321]
2nd phone is 54321

ReadFull reads exactly len(buf) bytes into the buf.

Reset discards any buffered data, resets all state, and switches the buffered reader to read from r.

ResetDict is like Reset, but also resets the dict.

func (d *Decoder) SetCustomStructTag(tag string)

SetCustomStructTag causes the decoder to use the supplied tag as a fallback option if there is no msgpack tag.

func (d *Decoder) SetMapDecoder(fn func(*Decoder) (interface{}, error))
buf := new(bytes.Buffer)

enc := msgpack.NewEncoder(buf)
in := map[string]string{"hello": "world"}
err := enc.Encode(in)
if err != nil {
	panic(err)
}

dec := msgpack.NewDecoder(buf)

// Causes decoder to produce map[string]string instead of map[string]interface{}.
dec.SetMapDecoder(func(d *msgpack.Decoder) (interface{}, error) {
	n, err := d.DecodeMapLen()
	if err != nil {
		return nil, err
	}

	m := make(map[string]string, n)
	for i := 0; i < n; i++ {
		mk, err := d.DecodeString()
		if err != nil {
			return nil, err
		}

		mv, err := d.DecodeString()
		if err != nil {
			return nil, err
		}

		m[mk] = mv
	}
	return m, nil
})

out, err := dec.DecodeInterface()
if err != nil {
	panic(err)
}
fmt.Printf("%#v", out)
Output:

map[string]string{"hello":"world"}
func (d *Decoder) UseInternedStrings(on bool)

UseInternedStrings enables support for decoding interned strings.

func (d *Decoder) UseLooseInterfaceDecoding(on bool)

UseLooseInterfaceDecoding causes decoder to use DecodeInterfaceLoose to decode msgpack value into Go interface{}.

func (d *Decoder) UsePreallocateValues(on bool)

UsePreallocateValues enables preallocating values in chunks

func GetEncoder() *Encoder

NewEncoder returns a new encoder that writes to w.

func (e *Encoder) Encode(v interface{}) error

EncodeNumber encodes an int64 in 1, 2, 3, 5, or 9 bytes. Type of the number is lost during encoding.

EncodeInt8 encodes an int8 in 2 bytes preserving type of the number.

EncodeInt16 encodes an int16 in 3 bytes preserving type of the number.

EncodeInt32 encodes an int32 in 5 bytes preserving type of the number.

EncodeInt64 encodes an int64 in 9 bytes preserving type of the number.

func (e *Encoder) EncodeMulti(v ...interface{}) error

EncodeUnsignedNumber encodes an uint64 in 1, 2, 3, 5, or 9 bytes. Type of the number is lost during encoding.

EncodeUint8 encodes an uint8 in 2 bytes preserving type of the number.

EncodeUint16 encodes an uint16 in 3 bytes preserving type of the number.

EncodeUint32 encodes an uint16 in 5 bytes preserving type of the number.

EncodeUint64 encodes an uint16 in 9 bytes preserving type of the number.

Reset discards any buffered data, resets all state, and switches the writer to write to w.

ResetDict is like Reset, but also resets the dict.

func (e *Encoder) SetCustomStructTag(tag string)

SetCustomStructTag causes the Encoder to use a custom struct tag as fallback option if there is no msgpack tag.

func (e *Encoder) SetOmitEmpty(on bool)

SetOmitEmpty causes the Encoder to omit empty values by default.

func (e *Encoder) SetSortMapKeys(on bool) *Encoder

SetSortMapKeys causes the Encoder to encode map keys in increasing order. Supported map types are:

  • map[string]string
  • map[string]bool
  • map[string]interface{}
func (e *Encoder) UseArrayEncodedStructs(on bool)

UseArrayEncodedStructs causes the Encoder to encode Go structs as msgpack arrays.

type Item struct {
	Foo string
	Bar string
}

var buf bytes.Buffer
enc := msgpack.NewEncoder(&buf)
enc.UseArrayEncodedStructs(true)

err := enc.Encode(&Item{Foo: "foo", Bar: "bar"})
if err != nil {
	panic(err)
}

dec := msgpack.NewDecoder(&buf)
v, err := dec.DecodeInterface()
if err != nil {
	panic(err)
}
fmt.Println(v)
Output:

[foo bar]
func (e *Encoder) UseCompactFloats(on bool)

UseCompactFloats causes the Encoder to chose a compact integer encoding for floats that can be represented as integers.

func (e *Encoder) UseCompactInts(on bool)

UseCompactEncoding causes the Encoder to chose the most compact encoding. For example, it allows to encode small Go int64 as msgpack int8 saving 7 bytes.

func (e *Encoder) UseInternedStrings(on bool)

UseInternedStrings causes the Encoder to intern strings.

Writer returns the Encoder's writer.

type Marshaler interface {
	MarshalMsgpack() ([]byte, error)
}
type MarshalerUnmarshaler interface {
	Marshaler
	Unmarshaler
}
func (m *RawMessage) DecodeMsgpack(dec *Decoder) error
func (m RawMessage) EncodeMsgpack(enc *Encoder) error
type Unmarshaler interface {
	UnmarshalMsgpack([]byte) error
}