检索基于原始类型的类型的reflect.Kind
在Go中,确定类型的reflect.Kind可能很棘手当类型实现基于原始类型的接口时。例如,考虑以下场景:
type ID interface { myid() } type id string func (id) myid() {} func main() { id := ID(id("test")) fmt.Println(id) fmt.Println(reflect.TypeOf(id)) // How to get the kind to return "reflect.Interface" from the var "id"? fmt.Println(reflect.TypeOf(id).Kind()) }
在此示例中,ID 接口由 id 类型实现,该类型基于原始字符串类型。虽然我们希望reflect.TypeOf(id).Kind()返回reflect.Interface,但它却返回reflect.String。
使用指向接口的指针的解决方案
To解决这个问题,我们需要记住reflect.TypeOf()需要一个interface{}。当使用非接口值时,Go 会自动将它们隐式包装在 interface{} 中。为了避免这种情况,我们可以使用指向接口的指针。
t := reflect.TypeOf(&id).Elem() fmt.Println(t.Kind())
通过使用reflect.TypeOf(&id).Elem(),我们检索ID接口的类型描述符,这就是我们的感兴趣。Elem() 方法为我们提供了指针类型的元素类型,即接口类型。
运行更新后的代码现在将输出:
test main.ID interface
这演示了如何正确获取基于原始类型实现接口的类型的reflect.Kind。
以上是如何在 Go 中检索基于原始类型实现接口的类型的'reflect.Kind.Interface”?的详细内容。更多信息请关注PHP中文网其他相关文章!