代码拉取完成,页面将自动刷新
package api
import (
"gitee.com/quant1x/gox/errors"
"reflect"
"strconv"
)
var (
// 结构体 tag array的反射的字段缓存
__mapTagArray map[reflect.Type]map[int]reflect.StructField = nil
)
func init() {
__mapTagArray = make(map[reflect.Type]map[int]reflect.StructField)
}
func initTag(t reflect.Type) map[int]reflect.StructField {
ma, mok := __mapTagArray[t]
if mok {
return ma
}
ma = nil
fieldNum := t.NumField()
for i := 0; i < fieldNum; i++ {
field := t.Field(i)
tag := field.Tag
if len(tag) > 0 {
tv, ok := tag.Lookup("array")
if ok {
index, err := strconv.Atoi(tv)
if err == nil {
if ma == nil {
ma = make(map[int]reflect.StructField)
__mapTagArray[t] = ma
}
ma[index] = field
}
}
}
}
return ma
}
// Convert 将字符串数组按照下标的序号反射给一个结构体
func Convert[T any](data []string, v *T) error {
obj := reflect.ValueOf(v)
t := obj.Type()
if obj.Kind() == reflect.Ptr {
t = t.Elem()
obj = obj.Elem()
}
ma := initTag(t)
if ma == nil {
return errors.New("can not Convert")
}
//fieldNum := t.NumField()
fieldNum := len(data)
for i := 0; i < fieldNum; i++ {
field, ok := ma[i]
if ok {
dv := data[i]
ov := obj.FieldByName(field.Name)
if ov.CanSet() {
var value interface{}
switch ov.Interface().(type) {
case string:
value = dv
case int8:
t := ParseInt(dv)
value = int8(t)
case int16:
t := ParseInt(dv)
value = int16(t)
case int32:
t := ParseInt(dv)
value = int32(t)
case int64:
t := ParseInt(dv)
value = int64(t)
case uint8:
t := ParseUint(dv)
value = uint8(t)
case uint16:
t := ParseUint(dv)
value = uint16(t)
case uint32:
t := ParseUint(dv)
value = uint32(t)
case uint64:
t := ParseUint(dv)
value = t
case float32:
t := ParseFloat(dv)
value = float32(t)
case float64:
t := ParseFloat(dv)
value = t
case bool:
t, _ := strconv.ParseBool(dv)
value = t
default:
value = dv
}
ov.Set(reflect.ValueOf(value))
}
}
}
return nil
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。