golang反射值的类型是切片。

huangapple go评论95阅读模式
英文:

golang reflect value kind of slice

问题

你可以使用reflect.TypeOf函数来获取切片的反射值的类型。以下是示例代码:

t := reflect.TypeOf(v.Interface())
fmt.Println(t)

这将打印出切片的类型。在你的例子中,它将打印出[]int[]string

希望这可以帮助到你!

英文:
fmt.Println(v.Kind())
fmt.Println(reflect.TypeOf(v))

How can I find out the type of the reflect value of a slice?

The above results in

v.Kind = slice
typeof = reflect.Value

When i try to Set it will crash if i create the wrong slice

t := reflect.TypeOf([]int{})
s := reflect.MakeSlice(t, 0, 0)
v.Set(s)

For example []int{} instead of []string{} so I need to know the exact slice type of the reflect value before I create one.

答案1

得分: 14

首先,我们需要确保我们正在处理一个切片,可以通过测试以下代码来实现:reflect.TypeOf(<var>).Kind() == reflect.Slice

如果没有进行这个检查,可能会导致运行时错误。所以,现在我们知道我们正在处理一个切片后,找到元素类型就很简单了:typ := reflect.TypeOf(<var>).Elem()

由于我们可能期望有多种不同的元素类型,我们可以使用switch语句来区分:

t := reflect.TypeOf(<var>)
if t.Kind() != reflect.Slice {
    // 处理非切片变量
}
switch t.Elem().Kind() {  // 切片元素的类型
    case reflect.Int:
        // 处理int类型的情况
    case reflect.String:
        // 处理string类型的情况
    ...
    default:
        // 自定义类型或结构体必须显式指定类型,
        // 使用定义类型的reflect.TypeOf调用。
}
英文:

To start, we need to ensure that the we're dealing with a slice by testing: reflect.TypeOf(&lt;var&gt;).Kind() == reflect.Slice

Without that check, you risk a runtime panic. So, now that we know we're working with a slice, finding the element type is as simple as: typ := reflect.TypeOf(&lt;var&gt;).Elem()

Since we're likely expecting many different element types, we can use a switch statement to differentiate:

t := reflect.TypeOf(&lt;var&gt;)
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.
}

huangapple
  • 本文由 发表于 2017年5月26日 17:20:18
  • 转载请务必保留本文链接:https://go.coder-hub.com/44197951.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定