gojay

high performance JSON encoder/decoder with stream API for Golang
git clone git://git.lair.cx/gojay
Log | Files | Refs | README | LICENSE

commit 86e4b630f45da3bb0aa8ff9efa4b73ba416a5da8
parent 083b06782b614bb2870f2e8ff2b7d8638274cc81
Author: francoispqt <francois@parquet.ninja>
Date:   Sat, 28 Apr 2018 22:10:44 +0800

update BorrowDecoder api

Diffstat:
MREADME.md | 19+++++++++++++++++++
Mdecode.go | 24++++++++++++------------
Mdecode_pool.go | 5++++-
Mdecode_stream_pool.go | 6+++++-
Mdecode_stream_pool_test.go | 8++++----
Mdecode_stream_test.go | 2+-
Mdecode_unsafe.go | 24++++++++++++------------
7 files changed, 57 insertions(+), 31 deletions(-)

diff --git a/README.md b/README.md @@ -117,6 +117,25 @@ You can either get a fresh `*gojay.Decoder` calling `dec := gojay.NewDecoder(io. After using a decoder, you can release it by calling `dec.Release()`. Beware, if you reuse the decoder after releasing it, it will panic with an error of type `InvalidUsagePooledDecoderError`. If you want to fully benefit from the pooling, you must release your decoders after using. +Example getting a fresh an releasing: +```go +str := "" +dec := gojay.NewDecoder(strings.NewReader(`"test"`)) +defer dec.Release() +if err := dec.Decode(&str); err != nil { + log.Fatal(err) +} +``` +Example borrowing a decoder and releasing: +```go +str := "" +dec := gojay.BorrowDecoder(strings.NewReader(`"test"`)) +defer dec.Release() +if err := dec.Decode(&str); err != nil { + log.Fatal(err) +} +``` + `*gojay.Decoder` has multiple methods to decode to specific types: * Decode ```go diff --git a/decode.go b/decode.go @@ -13,7 +13,7 @@ import ( // If a JSON value is not appropriate for a given target type, or if a JSON number // overflows the target type, UnmarshalArray skips that field and completes the unmarshaling as best it can. func UnmarshalArray(data []byte, v UnmarshalerArray) error { - dec := BorrowDecoder(nil, 0) + dec := BorrowDecoder(nil) defer dec.Release() dec.data = make([]byte, len(data)) copy(dec.data, data) @@ -35,7 +35,7 @@ func UnmarshalArray(data []byte, v UnmarshalerArray) error { // If a JSON value is not appropriate for a given target type, or if a JSON number // overflows the target type, UnmarshalObject skips that field and completes the unmarshaling as best it can. func UnmarshalObject(data []byte, v UnmarshalerObject) error { - dec := BorrowDecoder(nil, 0) + dec := BorrowDecoder(nil) defer dec.Release() dec.data = make([]byte, len(data)) copy(dec.data, data) @@ -73,53 +73,53 @@ func Unmarshal(data []byte, v interface{}) error { var dec *Decoder switch vt := v.(type) { case *string: - dec = BorrowDecoder(nil, 0) + dec = BorrowDecoder(nil) dec.length = len(data) dec.data = data err = dec.decodeString(vt) case *int: - dec = BorrowDecoder(nil, 0) + dec = BorrowDecoder(nil) dec.length = len(data) dec.data = data err = dec.decodeInt(vt) case *int32: - dec = BorrowDecoder(nil, 0) + dec = BorrowDecoder(nil) dec.length = len(data) dec.data = data err = dec.decodeInt32(vt) case *uint32: - dec = BorrowDecoder(nil, 0) + dec = BorrowDecoder(nil) dec.length = len(data) dec.data = data err = dec.decodeUint32(vt) case *int64: - dec = BorrowDecoder(nil, 0) + dec = BorrowDecoder(nil) dec.length = len(data) dec.data = data err = dec.decodeInt64(vt) case *uint64: - dec = BorrowDecoder(nil, 0) + dec = BorrowDecoder(nil) dec.length = len(data) dec.data = data err = dec.decodeUint64(vt) case *float64: - dec = BorrowDecoder(nil, 0) + dec = BorrowDecoder(nil) dec.length = len(data) dec.data = data err = dec.decodeFloat64(vt) case *bool: - dec = BorrowDecoder(nil, 0) + dec = BorrowDecoder(nil) dec.length = len(data) dec.data = data err = dec.decodeBool(vt) case UnmarshalerObject: - dec = BorrowDecoder(nil, 0) + dec = BorrowDecoder(nil) dec.length = len(data) dec.data = make([]byte, len(data)) copy(dec.data, data) _, err = dec.decodeObject(vt) case UnmarshalerArray: - dec = BorrowDecoder(nil, 0) + dec = BorrowDecoder(nil) dec.length = len(data) dec.data = make([]byte, len(data)) copy(dec.data, data) diff --git a/decode_pool.go b/decode_pool.go @@ -22,7 +22,10 @@ func NewDecoder(r io.Reader) *Decoder { // BorrowDecoder borrows a Decoder from the pool. // It takes an io.Reader implementation as data input. // It initiates the done channel returned by Done(). -func BorrowDecoder(r io.Reader, bufSize int) *Decoder { +func BorrowDecoder(r io.Reader) *Decoder { + return borrowDecoder(r, 512) +} +func borrowDecoder(r io.Reader, bufSize int) *Decoder { select { case dec := <-decPool: dec.called = 0 diff --git a/decode_stream_pool.go b/decode_stream_pool.go @@ -19,7 +19,11 @@ func (s stream) NewDecoder(r io.Reader) *StreamDecoder { // BorrowDecoder borrows a StreamDecoder a decoder from the pool. // It takes an io.Reader implementation as data input. // It initiates the done channel returned by Done(). -func (s stream) BorrowDecoder(r io.Reader, bufSize int) *StreamDecoder { +func (s stream) BorrowDecoder(r io.Reader) *StreamDecoder { + return s.borrowDecoder(r, 512) +} + +func (s stream) borrowDecoder(r io.Reader, bufSize int) *StreamDecoder { select { case streamDec := <-streamDecPool: streamDec.called = 0 diff --git a/decode_stream_pool_test.go b/decode_stream_pool_test.go @@ -13,7 +13,7 @@ func TestDecodeStreamBorrow(t *testing.T) { dec := Stream.NewDecoder(nil) streamDecPool <- dec // borrow one decoder to the channel - nDec := Stream.BorrowDecoder(nil, 0) + nDec := Stream.BorrowDecoder(nil) // make sure they are the same assert.Equal(t, dec, nDec, "decoder added to the pool and new decoder should be the same") } @@ -27,7 +27,7 @@ func TestDecodeStreamBorrow1(t *testing.T) { // reset streamDecPool streamDecPool = make(chan *StreamDecoder, 1) // borrow one decoder to the channel - nDec := Stream.BorrowDecoder(nil, 0) + nDec := Stream.BorrowDecoder(nil) // make sure they are the same assert.NotEqual(t, dec, nDec, "decoder added to the pool and new decoder should be the same") } @@ -39,7 +39,7 @@ func TestDecodeStreamBorrow2(t *testing.T) { dec.data = make([]byte, 128) streamDecPool <- dec // borrow one decoder to the channel - nDec := Stream.BorrowDecoder(nil, 512) + nDec := Stream.BorrowDecoder(nil) // make sure they are the same assert.Equal(t, dec, nDec, "decoder added to the pool and new decoder should be the same") assert.Equal(t, 512, len(nDec.data), "len of dec.data should be 512") @@ -48,7 +48,7 @@ func TestDecodeStreamBorrow3(t *testing.T) { // we override the pool chan streamDecPool = make(chan *StreamDecoder, 16) // borrow one decoder to the channel - nDec := Stream.BorrowDecoder(nil, 512) + nDec := Stream.BorrowDecoder(nil) // make sure they are the same assert.Equal(t, 512, len(nDec.data), "len of dec.data should be 512") } diff --git a/decode_stream_test.go b/decode_stream_test.go @@ -375,7 +375,7 @@ func TestStreamDecodingErrNotSet(t *testing.T) { } func TestStreamDecodingPoolError(t *testing.T) { - dec := Stream.BorrowDecoder(nil, 0) + dec := Stream.BorrowDecoder(nil) dec.Release() defer func() { err := recover() diff --git a/decode_unsafe.go b/decode_unsafe.go @@ -14,7 +14,7 @@ var Unsafe = decUnsafe{} type decUnsafe struct{} func (u decUnsafe) UnmarshalArray(data []byte, v UnmarshalerArray) error { - dec := BorrowDecoder(nil, 0) + dec := BorrowDecoder(nil) defer dec.Release() dec.data = data dec.length = len(data) @@ -29,7 +29,7 @@ func (u decUnsafe) UnmarshalArray(data []byte, v UnmarshalerArray) error { } func (u decUnsafe) UnmarshalObject(data []byte, v UnmarshalerObject) error { - dec := BorrowDecoder(nil, 0) + dec := BorrowDecoder(nil) defer dec.Release() dec.data = data dec.length = len(data) @@ -48,52 +48,52 @@ func (u decUnsafe) Unmarshal(data []byte, v interface{}) error { var dec *Decoder switch vt := v.(type) { case *string: - dec = BorrowDecoder(nil, 0) + dec = BorrowDecoder(nil) dec.length = len(data) dec.data = data err = dec.decodeString(vt) case *int: - dec = BorrowDecoder(nil, 0) + dec = BorrowDecoder(nil) dec.length = len(data) dec.data = data err = dec.decodeInt(vt) case *int32: - dec = BorrowDecoder(nil, 0) + dec = BorrowDecoder(nil) dec.length = len(data) dec.data = data err = dec.decodeInt32(vt) case *uint32: - dec = BorrowDecoder(nil, 0) + dec = BorrowDecoder(nil) dec.length = len(data) dec.data = data err = dec.decodeUint32(vt) case *int64: - dec = BorrowDecoder(nil, 0) + dec = BorrowDecoder(nil) dec.length = len(data) dec.data = data err = dec.decodeInt64(vt) case *uint64: - dec = BorrowDecoder(nil, 0) + dec = BorrowDecoder(nil) dec.length = len(data) dec.data = data err = dec.decodeUint64(vt) case *float64: - dec = BorrowDecoder(nil, 0) + dec = BorrowDecoder(nil) dec.length = len(data) dec.data = data err = dec.decodeFloat64(vt) case *bool: - dec = BorrowDecoder(nil, 0) + dec = BorrowDecoder(nil) dec.length = len(data) dec.data = data err = dec.decodeBool(vt) case UnmarshalerObject: - dec = BorrowDecoder(nil, 0) + dec = BorrowDecoder(nil) dec.length = len(data) dec.data = data _, err = dec.decodeObject(vt) case UnmarshalerArray: - dec = BorrowDecoder(nil, 0) + dec = BorrowDecoder(nil) dec.length = len(data) dec.data = data _, err = dec.decodeArray(vt)