一尘不染

golang反映价值的一种切片

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


阅读 255

收藏
2020-07-02

共1个答案

一尘不染

首先,我们需要通过测试来确保我们正在处理切片: 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().Kind() {  // 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.
}
2020-07-02