flexible data type for Go
Clone or download
Latest commit 59ca741 Aug 20, 2018
Permalink
Failed to load latest commit information.
.gitignore add ignore setting Jun 27, 2016
.travis.yml fix travis.yml Jul 30, 2018
LICENSE Initial commit Jun 15, 2016
README.md fix travis.yml Jul 30, 2018
convert.go refactor convert.go Aug 18, 2018
convert_asBool_test.go fix by lint Nov 29, 2017
convert_asFloat_test.go fix by lint Nov 29, 2017
convert_asInt_test.go fix by lint Nov 29, 2017
convert_asTime_test.go fix by lint Nov 29, 2017
convert_asUint_test.go fix by lint Nov 29, 2017
convert_test.go add URL type Jul 30, 2018
generic.go fix MarshalJSON/UnmarshalJSON, Value and add Weak Nov 26, 2017
generic_test.go fix by lint Nov 29, 2017
json_marshal_benchmark_test.go add URL type Jul 30, 2018
json_unmarshal_benchmark_test.go add URL type Jul 30, 2018
travis.sh add travis CI test config and shell Jun 27, 2016
type_bool.go add Mustxxx functions Aug 20, 2018
type_bool_test.go add Mustxxx functions Aug 20, 2018
type_float.go add Mustxxx functions Aug 20, 2018
type_float_test.go add Mustxxx functions Aug 20, 2018
type_int.go add Mustxxx functions Aug 20, 2018
type_int_test.go add Mustxxx functions Aug 20, 2018
type_string.go add Mustxxx functions Aug 20, 2018
type_string_test.go add Mustxxx functions Aug 20, 2018
type_time.go add Mustxxx functions Aug 20, 2018
type_time_test.go add Mustxxx functions Aug 20, 2018
type_timestamp.go add Mustxxx functions Aug 20, 2018
type_timestamp_milliseconds.go add MustTimestampMS and MustTimestampNano Aug 20, 2018
type_timestamp_milliseconds_test.go add MustTimestampMS and MustTimestampNano Aug 20, 2018
type_timestamp_nanoseconds.go add MustTimestampMS and MustTimestampNano Aug 20, 2018
type_timestamp_nanoseconds_test.go add MustTimestampMS and MustTimestampNano Aug 20, 2018
type_timestamp_test.go add Mustxxx functions Aug 20, 2018
type_uint.go add Mustxxx functions Aug 20, 2018
type_uint_test.go add Mustxxx functions Aug 20, 2018
type_url.go add Mustxxx functions Aug 20, 2018
type_url_test.go add Mustxxx functions Aug 20, 2018

README.md

Generic

GoDoc License Build Status Coverage Status Go Report Card

flexible data type for Go

support: Go 1.8+

Install

standard go get:

go get -u github.com/usk81/generic

Usage

encode/decode:

package main

import (
	"encoding/json"
	"github.com/usk81/generic"
)

type User struct {
	Name String      `json:"name"`
	Age  generic.Int `json:"age"`
}

var user1 User
u1 := []byte(`{"name":"Daryl Dixon","age":"40"}`)
json.Unmarshal([]byte(u1), &user1)
b, _ := json.Marshal(user1)
Println(string(b))
// {"name":"Daryl Dixon","age":40}

var user2 User
u2 := []byte(`{"name":"Rick Grimes"}`)
json.Unmarshal([]byte(u2), &user2)
b, _ := json.Marshal(user2)
Println(string(b))
// {"name":"Rick Grimes","age":null}

set:

package main

import (
	"fmt"
	"github.com/usk81/generic"
)

func main() {
	v := 1.0

	var tb generic.Bool
	tb.Set(v)
	vb := tb.Weak()
	fmt.Printf("%v, (%T)\n", vb, vb)
	// true, (bool)

	var tf generic.Float
	tf.Set(v)
	vf := tf.Weak()
	fmt.Printf("%v, (%T)\n", vf, vf)
	// 1, (float64)

	var ti generic.Int
	ti.Set(v)
	vi := ti.Weak()
	fmt.Printf("%v, (%T)\n", vi, vi)
	// 1, (int64)

	var ts generic.String
	ts.Set(v)
	vs := ts.Weak()
	fmt.Printf("%v, (%T)\n", vs, vs)
	// 1, (string)

	var tt generic.Time
	tt.Set(v)
	vt := tt.Weak()
	fmt.Printf("%v, (%T)\n", vt.UTC(), vt)
	// 1970-01-01 09:00:01 +0900 JST, (time.Time)

	var tu generic.Uint
	tu.Set(v)
	vu := tu.Weak()
	fmt.Printf("%v, (%T)\n", vu, vu)
	// 1, (uint64)
}

Benchmarks

Marshal

Bool

version requests /op B/op allocs/op
1.0.0 5000000 240 ns 185 3
2.0.0 200000000 6.69 ns 0 0

Float

version requests /op B/op allocs/op
1.0.0 3000000 425 ns 192 3
2.0.0 5000000 260 ns 64 3

Int

version requests /op B/op allocs/op
1.0.0 5000000 265 ns 192 3
2.0.0 20000000 70.5 ns 16 2

String (small)

version requests /op B/op allocs/op
1.0.0 3000000 382 ns 200 3
2.0.0 20000000 89.0 ns 128 2

String (Large)

version requests /op B/op allocs/op
1.0.0 1000000 1056 ns 776 4
2.0.0 5000000 237 ns 896 2

Time

version requests /op B/op allocs/op
1.0.0 1000000 1122 ns 360 5
2.0.0 3000000 401 ns 48 1

TimestampMS

version requests /op B/op allocs/op
1.0.0 20000000 97.9 ns 32 2
2.0.0 20000000 91.2 ns 32 2

TimestampNano

version requests /op B/op allocs/op
1.0.0 10000000 114 ns 64 2
2.0.0 10000000 112 ns 64 2

Timestamp

version requests /op B/op allocs/op
1.0.0 20000000 88.4 ns 32 2
2.0.0 20000000 86.7 ns 32 2

Uint

version requests /op B/op allocs/op
1.0.0 5000000 277 ns 192 3
2.0.0 20000000 64.2 ns 16 2

Licence

MIT

Author

Yusuke Komatsu