以下代码运行不会是10,而是返回 0
package mainimport ("fmt""github.com/spf13/cast"
)type UserNum int32func main() {var uNum UserNumuNum = 10uNumint64 := cast.ToInt64(uNum)uNumint64E, err := cast.ToInt64E(uNum)fmt.Println(uNumint64)fmt.Println(uNumint64E, err)
}
看一下源码,ToInt64()直接屏蔽了错误,可以使用 ToInt64E 这种,返回带错误的函数
// ToInt64 casts an interface to an int64 type.
func ToInt64(i interface{}) int64 {v, _ := ToInt64E(i)return v
}// ToInt64E casts an interface to an int64 type.
func ToInt64E(i interface{}) (int64, error) {i = indirect(i)intv, ok := toInt(i)if ok {return int64(intv), nil}switch s := i.(type) {case int64:return s, nilcase int32:return int64(s), nilcase int16:return int64(s), nilcase int8:return int64(s), nilcase uint:return int64(s), nilcase uint64:return int64(s), nilcase uint32:return int64(s), nilcase uint16:return int64(s), nilcase uint8:return int64(s), nilcase float64:return int64(s), nilcase float32:return int64(s), nilcase string:v, err := strconv.ParseInt(trimZeroDecimal(s), 0, 0)if err == nil {return v, nil}return 0, fmt.Errorf("unable to cast %#v of type %T to int64", i, i)case json.Number:return ToInt64E(string(s))case bool:if s {return 1, nil}return 0, nilcase nil:return 0, nildefault:return 0, fmt.Errorf("unable to cast %#v of type %T to int64", i, i)}
}