SoFunction
Updated on 2025-03-01

A brief analysis of golang/spf13/cast library that cannot recognize custom data types

The following code will not run at 10, but will return 0

package main
import (
	"fmt"
	"/spf13/cast"
)
type UserNum int32
func main() {
	var uNum UserNum
	uNum = 10
	uNumint64 := cast.ToInt64(uNum)
	uNumint64E, err := cast.ToInt64E(uNum)
	(uNumint64)
	(uNumint64E, err)
}

Look at the source code. ToInt64() directly blocks the error. You can use ToInt64E to return a function with error.

// 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, nil
	case int32:
		return int64(s), nil
	case int16:
		return int64(s), nil
	case int8:
		return int64(s), nil
	case uint:
		return int64(s), nil
	case uint64:
		return int64(s), nil
	case uint32:
		return int64(s), nil
	case uint16:
		return int64(s), nil
	case uint8:
		return int64(s), nil
	case float64:
		return int64(s), nil
	case float32:
		return int64(s), nil
	case string:
		v, err := (trimZeroDecimal(s), 0, 0)
		if err == nil {
			return v, nil
		}
		return 0, ("unable to cast %#v of type %T to int64", i, i)
	case :
		return ToInt64E(string(s))
	case bool:
		if s {
			return 1, nil
		}
		return 0, nil
	case nil:
		return 0, nil
	default:
		return 0, ("unable to cast %#v of type %T to int64", i, i)
	}
}

This is the article about the golang/spf13/cast library that cannot identify custom data types. For more related golang/spf13/cast library content, please search for my previous articles or continue browsing the related articles below. I hope everyone will support me in the future!