github.com/zlyuancn/zstr@v0.0.0-20230412074414-14d6b645962f/scan.go (about) 1 /* 2 ------------------------------------------------- 3 Author : Zhang Fan 4 date: 2020/1/11 5 Description : 6 ------------------------------------------------- 7 */ 8 9 package zstr 10 11 import ( 12 "encoding" 13 "fmt" 14 "strconv" 15 ) 16 17 type AnyUnmarshaler interface { 18 UnmarshalAny(any interface{}) error 19 } 20 21 // 扫描字符串到任何, 输出变量不支持切片,数组,map,struct 22 func Scan(s string, outPtr interface{}) (err error) { 23 switch p := outPtr.(type) { 24 case encoding.BinaryUnmarshaler: 25 return p.UnmarshalBinary(StringToBytes(&s)) 26 } 27 switch p := outPtr.(type) { 28 case AnyUnmarshaler: 29 return p.UnmarshalAny(s) 30 } 31 32 switch p := outPtr.(type) { 33 case nil: 34 return fmt.Errorf("zstr.Scan(nil)") 35 36 case *string: 37 *p = s 38 case *[]byte: 39 *p = StringToBytes(&s) 40 case *bool: 41 *p, err = ToBool(s) 42 case *int: 43 *p, err = strconv.Atoi(s) 44 case *int8: 45 var n int64 46 n, err = strconv.ParseInt(s, 10, 8) 47 *p = int8(n) 48 case *int16: 49 var n int64 50 n, err = strconv.ParseInt(s, 10, 16) 51 *p = int16(n) 52 case *int32: 53 var n int64 54 n, err = strconv.ParseInt(s, 10, 32) 55 *p = int32(n) 56 case *int64: 57 *p, err = strconv.ParseInt(s, 10, 64) 58 59 case *uint: 60 var n uint64 61 n, err = strconv.ParseUint(s, 10, 64) 62 *p = uint(n) 63 case *uint8: 64 var n uint64 65 n, err = strconv.ParseUint(s, 10, 8) 66 *p = uint8(n) 67 case *uint16: 68 var n uint64 69 n, err = strconv.ParseUint(s, 10, 16) 70 *p = uint16(n) 71 case *uint32: 72 var n uint64 73 n, err = strconv.ParseUint(s, 10, 32) 74 *p = uint32(n) 75 case *uint64: 76 *p, err = strconv.ParseUint(s, 10, 64) 77 78 case *float32: 79 var n float64 80 n, err = strconv.ParseFloat(s, 32) 81 *p = float32(n) 82 case *float64: 83 *p, err = strconv.ParseFloat(s, 64) 84 85 default: 86 return fmt.Errorf("zstr.Scan(%T)无法解码, 考虑为它实现encoding.BinaryUnmarshaler接口或zstr.AnyUnmarshaler", p) 87 } 88 return 89 } 90 91 // 扫描任何值到任何, 输出变量不支持切片,数组,map,struct 92 func ScanAny(any, outPtr interface{}) (err error) { 93 switch t := any.(type) { 94 case []byte: 95 return Scan(*BytesToString(t), outPtr) 96 case string: 97 return Scan(t, outPtr) 98 } 99 100 switch p := outPtr.(type) { 101 case AnyUnmarshaler: 102 return p.UnmarshalAny(any) 103 } 104 105 switch p := outPtr.(type) { 106 case nil: 107 return fmt.Errorf("zstr.Scan(nil)") 108 109 case *string: 110 *p = GetString(any) 111 case *[]byte: 112 s := GetString(any) 113 *p = StringToBytes(&s) 114 case *bool: 115 *p, err = ToBool(any) 116 case *int: 117 *p, err = ToInt(any) 118 case *int8: 119 *p, err = ToInt8(any) 120 case *int16: 121 *p, err = ToInt16(any) 122 case *int32: 123 *p, err = ToInt32(any) 124 case *int64: 125 *p, err = ToInt64(any) 126 127 case *uint: 128 *p, err = ToUint(any) 129 case *uint8: 130 *p, err = ToUint8(any) 131 case *uint16: 132 *p, err = ToUint16(any) 133 case *uint32: 134 *p, err = ToUint32(any) 135 case *uint64: 136 *p, err = ToUint64(any) 137 138 case *float32: 139 *p, err = ToFloat32(any) 140 case *float64: 141 *p, err = ToFloat64(any) 142 143 default: 144 return fmt.Errorf("zstr.Scan(%T)无法解码, 考虑为它实现zstr.AnyUnmarshaler接口", p) 145 } 146 return 147 }