diff --git a/helper/conv_helper.go b/helper/conv_helper.go index 4b01a44..b4de183 100644 --- a/helper/conv_helper.go +++ b/helper/conv_helper.go @@ -9,6 +9,7 @@ package helper import ( "strconv" + "unsafe" ) func AnyToInt(val any, dv int) (int, error) { @@ -115,3 +116,24 @@ func AnyToString(val any, dv string) (string, error) { return dv, nil } + +// BytesToString converts byte slice to string. +func BytesToString(b []byte) string { + return *(*string)(unsafe.Pointer(&b)) +} + +func Atoi(b []byte) (int, error) { + return strconv.Atoi(BytesToString(b)) +} + +func ParseInt(b []byte, base int, bitSize int) (int64, error) { + return strconv.ParseInt(BytesToString(b), base, bitSize) +} + +func ParseUint(b []byte, base int, bitSize int) (uint64, error) { + return strconv.ParseUint(BytesToString(b), base, bitSize) +} + +func ParseFloat(b []byte, bitSize int) (float64, error) { + return strconv.ParseFloat(BytesToString(b), bitSize) +} diff --git a/helper/scan_helper.go b/helper/scan_helper.go new file mode 100644 index 0000000..c5a9500 --- /dev/null +++ b/helper/scan_helper.go @@ -0,0 +1,124 @@ +// +// scan_helper.go +// Copyright (C) 2023 tiglog +// +// Distributed under terms of the MIT license. +// + +package helper + +import ( + "encoding" + "fmt" + "time" +) + +func Scan(b []byte, v interface{}) error { + switch v := v.(type) { + case nil: + return fmt.Errorf("golib helper: Scan(nil)") + case *string: + *v = BytesToString(b) + return nil + case *[]byte: + *v = b + return nil + case *int: + var err error + *v, err = Atoi(b) + return err + case *int8: + n, err := ParseInt(b, 10, 8) + if err != nil { + return err + } + *v = int8(n) + return nil + case *int16: + n, err := ParseInt(b, 10, 16) + if err != nil { + return err + } + *v = int16(n) + return nil + case *int32: + n, err := ParseInt(b, 10, 32) + if err != nil { + return err + } + *v = int32(n) + return nil + case *int64: + n, err := ParseInt(b, 10, 64) + if err != nil { + return err + } + *v = n + return nil + case *uint: + n, err := ParseUint(b, 10, 64) + if err != nil { + return err + } + *v = uint(n) + return nil + case *uint8: + n, err := ParseUint(b, 10, 8) + if err != nil { + return err + } + *v = uint8(n) + return nil + case *uint16: + n, err := ParseUint(b, 10, 16) + if err != nil { + return err + } + *v = uint16(n) + return nil + case *uint32: + n, err := ParseUint(b, 10, 32) + if err != nil { + return err + } + *v = uint32(n) + return nil + case *uint64: + n, err := ParseUint(b, 10, 64) + if err != nil { + return err + } + *v = n + return nil + case *float32: + n, err := ParseFloat(b, 32) + if err != nil { + return err + } + *v = float32(n) + return err + case *float64: + var err error + *v, err = ParseFloat(b, 64) + return err + case *bool: + *v = len(b) == 1 && b[0] == '1' + return nil + case *time.Time: + var err error + *v, err = time.Parse(time.RFC3339Nano, BytesToString(b)) + return err + case *time.Duration: + n, err := ParseInt(b, 10, 64) + if err != nil { + return err + } + *v = time.Duration(n) + return nil + case encoding.BinaryUnmarshaler: + return v.UnmarshalBinary(b) + default: + return fmt.Errorf( + "golib: can't unmarshal %T (consider implementing BinaryUnmarshaler)", v) + } +} diff --git a/helper/scan_helper_test.go b/helper/scan_helper_test.go new file mode 100644 index 0000000..fb813b4 --- /dev/null +++ b/helper/scan_helper_test.go @@ -0,0 +1,23 @@ +// +// scan_helper_test.go +// Copyright (C) 2023 tiglog +// +// Distributed under terms of the MIT license. +// + +package helper_test + +import ( + "fmt" + "testing" + + "git.hexq.cn/tiglog/golib/helper" +) + +func TestScan(t *testing.T) { + var foo = []byte("hello") + var dest string + helper.Scan(foo, &dest) + fmt.Println(dest) + +}