go - 如何将 reflect.New 的返回值转换回原始类型

标签 go reflection go-reflect

我在 go 中使用反射,我注意到下面表达的奇怪之处:<​​/p>

package main

import (
        "log"
        "reflect"
)

type Foo struct {
        a int
        b int
}

func main() {
        t := reflect.TypeOf(Foo{})
        log.Println(t) // main.Foo
        log.Println(reflect.TypeOf(reflect.New(t))) // reflect.Value not main.Foo
}

如何将 reflect.Value 转换回 main.Foo

我提供了一个 go playground为了方便。

最佳答案

您使用 Value.Interface方法获取接口(interface){},然后您可以使用类型断言来提取值:

t := reflect.TypeOf(Foo{})
val := reflect.New(t)
newT := val.Interface().(*Foo)

如果你不需要指针,你可以使用 reflect.Zero函数为该类型创建一个零值。然后,您使用相同的接口(interface)和类型断言方法来提取新值。

t := reflect.TypeOf(Foo{})
f := reflect.Zero(t)
newF := f.Interface().(Foo)

关于go - 如何将 reflect.New 的返回值转换回原始类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34098936/

相关文章:

go - 如何调用 golang struct 字段的函数?

c++ - 为什么 Rust 需要 C++ 工具链来生成 Rust 二进制文件,而像 Go 这样的语言没有这个要求?

python - 在Python中将列表动态分解为变量

Java:使用反射注入(inject)字段的最快方法是什么?

go - 如何在最新的 Go 周刊中比较两个函数的指针相等性?

pointers - 在 golang 中具有指向 0 值的指针的深度复制结构

Go 工作区与自定义文件夹结构

file - 检查文件是否位于基本目录中的最安全方法是什么?

c# - 在 C# 中注册一个类的所有声明的子类

pointers - 如何在使用反射时设置标签