Generic
flexible data type for Go
support: Go 1.12+
Install
standard go get
:
go get -u github.com/usk81/generic/v2
Usage
encode/decode:
package main
import (
"encoding/json"
"github.com/usk81/generic/v2"
)
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