我有一个接受单个
any
参数的函数,我需要检查它以以不同的方式处理各种类型。如果类型是“标准”内置类型,则参数将按原样返回,但其他自定义类型将转换为我可以处理的类型。
我通过使用反射来获取底层类型来支持类型定义,如下所示:
func getType(arg any) any {
ret := arg
switch ret.(type) {
case string, int, int32, []string, []int32, etc....:
// do nothing, ret is returned unmodified
default:
rv := reflect.ValueOf(arg)
switch rv.Kind() {
case reflect.String:
ret = rv.String()
case reflect.Int, reflect.Int32, reflect.Int64:
ret = rv.Int()
case reflect.Slice:
// here is where I want to support slices of type definitions, but I can't figure out
// how to get the first element of the slice and recursively pass it to my getType function to get the base native type
}
}
return ret
}
在执行以下操作时效果非常好:
type customStr string
var myStr customStr = "Hello World"
arg := getType(myStr)
但是我如何在
getType
函数中支持任意类型的切片?我知道如果 arg 是一个切片,其中第一个元素是切片中的第一个元素,那么我需要递归调用 getType
,并且如果第一个元素解析为本机 string
那么我基本上将 for _, a := range arg { ret = append(ret, str(a)) }
但是我一直迷失在从反射值获取切片并尝试索引第一个元素的过程中。
我最终想做的事情:
val := getType([]customStr{"Hello", "World"}) // Should make val a slice of native strings
你可以做(去游乐场):
switch rv.Kind() {
case reflect.Slice:
switch rv.Type().Elem().Kind() {
case reflect.String:
ret := make([]string, rv.Len())
for i := range rv.Len() {
ret[i] = rv.Index(i).String()
}
return ret
}
}
}
或类似的。但不确定这是否值得付出努力。