3.7 KiB
MessagePack for Golang
📣 Announcement: time.Time decoding defaults to UTC in v3
Starting with v3.0.0, when decoding MessagePack Timestamp into Go’s time.Time,
the default Location will be UTC (previously Local). The instant is unchanged.
To keep the old behavior, use SetDecodedTimeAsLocal().
Features
- Supported types : primitive / array / slice / struct / map / interface{} and time.Time
- Renaming fields via
msgpack:"field_name" - Omitting fields via
msgpack:"-" - Omitting empty fields via
msgpack:"field_name,omitempty" - Supports extend encoder / decoder (example)
- Can also Encoding / Decoding struct as array
Installation
Current version is msgpack/v2.
go get -u github.com/shamaton/msgpack/v2
Quick Start
package main
import (
"github.com/shamaton/msgpack/v2"
"net/http"
)
type Struct struct {
String string
}
// simple
func main() {
v := Struct{String: "msgpack"}
d, err := msgpack.Marshal(v)
if err != nil {
panic(err)
}
r := Struct{}
if err = msgpack.Unmarshal(d, &r); err != nil {
panic(err)
}
}
// streaming
func handle(w http.ResponseWriter, r *http.Request) {
var body Struct
if err := msgpack.UnmarshalRead(r, &body); err != nil {
panic(err)
}
if err := msgpack.MarshalWrite(w, body); err != nil {
panic(err)
}
}
📣 Announcement: time.Time decoding defaults to UTC in v3
TL;DR: Starting with v3.0.0, when decoding MessagePack Timestamp into Go’s time.Time, the default Location will be UTC (previously Local). The instant is unchanged—only the display/location changes. This avoids host-dependent differences and aligns with common distributed systems practice.
What is changing?
- Before (v2.x): Decoded
time.Timedefaults toLocal. - After (v3.0.0): Decoded
time.Timedefaults to UTC.
MessagePack’s Timestamp encodes an instant (epoch seconds + nanoseconds) and does not carry timezone info. Your data’s point in time is the same; only time.Time.Location() differs.
Why?
- Eliminate environment-dependent behavior (e.g., different hosts showing different local zones).
- Make “UTC by default” the safe, predictable baseline for logs, APIs, and distributed apps.
Who is affected?
- Apps that display local time without explicitly converting from UTC.
- If your code already normalizes to UTC or explicitly sets a location, you’re likely unaffected.
Keep the old behavior (Local)
If you want the v2 behavior on v3:
msgpack.SetDecodedTimeAsLocal()
Or convert after the fact:
var t time.Time
_ = msgpack.Unmarshal(data, &t)
t = t.In(time.Local)
Preview the new behavior on v2 (optional)
You can opt into UTC today on v2.x:
msgpack.SetDecodedTimeAsUTC()
Benchmark
This result made from shamaton/msgpack_bench
License
This library is under the MIT License.