这篇文章将搜集一些平时在工作中用到的使用反射小实例。 反射反射真快乐。
遍历一个slice,并且将它转换为int类型
代码语言:javascript复制func Slice2Ints(s interface{}) ([]int, error) {
val := reflect.ValueOf(s)
if val.Kind() != reflect.Slice {
return nil, fmt.Errorf("s:%v is not slice type", s)
}
ret := make([]int, 0, 10)
for i := 0; i < val.Len(); i {
e := val.Index(i)
v := e.Interface()
intV, err := ToInt(v)
if err != nil {
return nil, err
}
ret = append(ret, intV)
}
return ret, nil
}
附录,转换的几个工具函数
代码语言:javascript复制// ToInt 尝试将任意类型的数据转换为int
func ToInt(intObj interface{}) (int, error) {
// 假定int == int64,运行在64位机
// Debugf("ToInt:%v", intObj)
switch v := intObj.(type) {
case json.Number:
strVal := string(v)
return ToInt(strVal)
case int:
return v, nil
case int8:
return int(v), nil
case int16:
return int(v), nil
case int32:
return int(v), nil
case int64:
return int(v), nil
case uint:
return int(v), nil
case uint8:
return int(v), nil
case uint16:
return int(v), nil
case uint32:
return int(v), nil
case uint64:
if v > math.MaxInt64 {
info := fmt.Sprintf("ToInt error, overflowd %v", v)
return 0, errors.New(info)
}
return int(v), nil
case float32:
return int(v), nil
case float64:
return int(v), nil
case string:
strv := v
if strings.Contains(v, ".") {
strvArr := strings.Split(v, ".")
if len(strvArr) != 2 {
return 0, fmt.Errorf("ToInt error, invalid format:%v", v)
}
strv = strvArr[0]
}
if strv == "" {
return 0, fmt.Errorf("ToInt error, empty string cannot convert to int")
}
if intv, err := strconv.Atoi(strv); err == nil {
return intv, nil
}
}
return 0, fmt.Errorf("ToInt error, %v cannot convert to int", intObj)
}