golang反映了一种切片的价值

时间:2017-05-26 09:20:18

标签: go

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{},因此在创建反射值之前,我需要知道反射值的确切切片类型。

1 个答案:

答案 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.
}