gpt4 book ai didi

go - 如何在golang中使用接口(interface)反射的类型断言?

转载 作者:行者123 更新时间:2023-12-01 22:07:50 24 4
gpt4 key购买 nike

我正在尝试在 golang 中使用类型断言。
直接断言没有问题。

a, ok := i.(MyStruct)

但是当我使用反射时
b, ok := i.(reflect.TypeOf(i))

我有一个错误。那有什么问题?以及如何处理?

完整代码:
package main

import (
"fmt"
"reflect"
)

type MyStruct struct {
field string
}

func main() {
var i interface{} = MyStruct{field:"Thanks"}

a, ok := i.(MyStruct)
fmt.Println(a, ok)

t := reflect.TypeOf(i)
fmt.Println(t)

b, ok := i.(t)
fmt.Println(b, ok)
}

感谢您的回答。

最佳答案

很多事情,但基本上“它不是那样工作的”。类型断言中括号内的内容必须是 type ,即类型名称或类型文字。 reflect.TypeOf(i)不是其中之一,它是一个方法调用表达式。因此这是一个语法错误。 reflect.TypeOf不会“返回类型”(这在 Go 中并不是真正可以做的事情),它返回一个 reflect.Type ,这是一个普通的 go 结构,包含有关类型的信息(即元类型的排序)。

但它不起作用的更根本原因是因为它不能...... Go 需要知道变量在声明时的类型是什么。它的类型在 var 中明确给出。声明,或者从 var x = value 中的初始化值的类型推断声明或 x := value简短的任务。在编译时类型是未知的是不可能的。 Go 不允许您编写产生未确定类型的表达式。

类型断言的真正目的是获取接口(interface)类型的值(它是一种“盒子”,可以保存多种类型的值,或者对于 interface{},可以保存任何类型)并检索 a 的值具体的具体类型。断言产生的值将具有断言命名的类型,没有其他类型。 (在 ,ok 赋值的情况下,如果断言失败,变量将持有 zero value 但仍然是正确的类型)。如果您可以将断言写入仅在运行时才知道的类型,那么整个事情就会崩溃,所以您不能编写它——这是一个错误。

简而言之,您不能使用反射来做到这一点。您可以使用反射来了解 i 的类型。就是,你可以知道那个类型的名字,你可以知道它的底层Kind是结构,您可以枚举结构的字段并从中获取值,等等......所有这些都是反射的合法用途。但它不能给你一个 MyStruct 类型的变量。 — 方法是 i.(MyStruct) .

关于go - 如何在golang中使用接口(interface)反射的类型断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59980040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com