fmt.Println(v.Kind())
fmt.Println(reflect.TypeOf(v))
如何找出切片反射值的类型?
以上结果
v.Kind = slice
typeof = reflect.Value
当我尝试Set
时,如果我创建了错误的切片,它将崩溃
t := reflect.TypeOf([]int{})
s := reflect.MakeSlice(t, 0, 0)
v.Set(s)
例如[]int{}
而不是[]string{}
,因此在创建反射值之前,我需要知道反射值的确切切片类型。
答案 0 :(得分:3)
首先,我们需要通过测试确保我们正在处理切片:reflect.TypeOf(<var>).Kind() == reflect.Slice
如果不进行检查,您就会面临运行时恐慌的风险。所以,现在我们知道我们正在使用切片,找到元素类型就像这样简单:typ := reflect.TypeOf(<var>).Elem()
由于我们可能期望许多不同的元素类型,我们可以使用switch语句来区分:
t := reflect.TypeOf(<var>)
if t.Kind() != reflect.Slice {
// handle non-slice vars
}
switch t.Elem() { // type of the slice element
case reflect.Int:
// Handle int case
case reflect.String:
// Handle string case
...
default:
// custom types or structs must be explicitly typed
// using calls to reflect.TypeOf on the defined type.
}