我设法做到了这一点,但它看上去没有效率:
var t reflect.Type
switch t {
case reflect.TypeOf(([]uint8)(nil)):
// handle []uint8 array type
}发布于 2015-10-30 19:54:43
如果您只是试图检测类型,则可能不需要反射。
switch t := myVar.(type){
case []uint8:
// t is []uint8
case *Foo:
// t is *Foo
default:
panic("unknown type")
}你到底想做什么?
发布于 2015-10-30 19:56:20
第一个问题,您确定要打开reflect.Type而不使用类型开关吗?示例:
switch x := y.(type) {
case []uint8:
// x is now a []uint8
}假设这对您的情况不起作用,我的建议是使这些包变量。示例:
var uint8SliceType = reflect.TypeOf(([]uint8)(nil))
func Foo() {
var t reflect.Type
switch t {
case uint8SliceType:
// handle []uint8 array type
}
}发布于 2021-06-10 12:53:33
对于最初的问题如何打开reflect.Type?的答案是:你不能。但是,你可以用reflect.Value来做。
v interface{},您可以调用reflect.TypeOf(v)和reflect.ValueOf(v),它们返回reflect.Type或reflect.Value,resp。v的类型不是interface{},那么这些函数调用将将其转换为interface{}。reflect.Type包含有关该类型的各种运行时信息,但它不包含任何可用于检索类型开关中所需的v本身类型的信息。reflect.Value通过其Interface()方法提供它,该方法以interface{}的形式返回底层值。这可以在类型开关或类型断言中使用。import "fmt"
import "reflect"
var v int
var rt reflect.Type = reflect.TypeOf(v)
fmt.Println(rt.String(), " has awesome properties: Its alignment is",
rt.Align(), ", it has", rt.Size(), "bytes, is it even comparable?",
rt.Comparable())
// … but reflect.Type won’t tell us what the real type is :(
// Let’s see if reflect.Value can help us.
var rv reflect.Value = reflect.ValueOf(v)
// Here we go:
vi := rv.Interface()
switch vi.(type) {
// Mission accomplished.
}也许这有助于澄清几点,这可能会引起对Go中的动态输入的混淆。至少我被这事弄糊涂了好长一段时间。
reflect对interface{}
在Go中有两个运行时泛型系统:
interface{},用于类型切换/断言,reflect包,用于检查运行时泛型类型和此类值。这两个系统是分开的世界,一个可能的东西和另一个不可能的东西。例如,给定一个interface{},如果该值是一个数组或片(不管它的元素类型如何),那么就不可能获得第一个元素的值。要做到这一点,需要使用reflect。相反,使用reflect不可能进行类型切换或断言:将其转换为interface{},然后您就可以这样做了。
在这些系统之间只有很少的接口点。一方面,TypeOf()和ValueOf()函数接受interface{}并返回reflect结构。另一个方向是Value.Interface()。
一个人需要一个Value而不是一个Type来做一个类型转换,这有点违背直觉。至少,这在某种程度上与需要通过调用Type来构造TypeOf()的值这一事实是一致的。
reflect.Kind
reflect.Type和reflect.Value都有一个Kind()方法。一些人建议使用这些方法返回的值(类型为reflect.Kind )来模拟类型开关。
虽然这在某些情况下可能很有用,但它并不是类型开关的替代品。例如,使用Kind不能区分int64和time.Duration,因为后者是已定义
type Duration int64Kind用于判断一个类型是否是任何类型的结构、数组、切片等等,而不管它是由哪种类型组成的。这是不可能找到的类型开关。
(旁注)我有同样的问题,但发现这里没有任何帮助,所以我自己去找出答案。反问:“你为什么要这么做?”,然后是不相关的答案,这对我也没有任何帮助。我有一个很好的理由来解释我为什么要这样做。)
https://stackoverflow.com/questions/33443867
复制相似问题