go - 获取 interface{ } 的值,而无需访问类型

标签 go types reflection type-assertion

如何获取 x 的值作为 []interface{}

func main() {

    var x interface{} = SomeFunc()
    
    fmt.Println(x) // this prints [1 2].

    val := x.([]interface{}) // this will not work because '[]interface{}' is different type than 'a'

}

func SomeFunc() interface{} {
    // some type I dont have access to
    type a []interface{}

    var someArray a = make([]interface{}, 0)
    someArray = append(someArray, 1)
    someArray = append(someArray, 2)
    return someArray
}

最佳答案

Type asserting 具体类型仅适用于存储在接口(interface)值中的精确( identical )具体类型,您不能键入断言“相似”类型(例如具有相同基础类型的类型)。 p>

在您的情况下,您想要的是获取可转换为已知类型的值(例如,a 类型的值可转换为 []interface{} 类型的值)。如上所述,这对于类型断言是不可能的。

最简单的方法是导入包含具体类型定义的包(并类型断言该类型的值)。如果它未导出或不可访问,您唯一的选择是使用反射。您可以使用Value.Convert()将值转换为另一种类型的值,您可以键入断言的类型的值。要检查该值是否实际上可转换,您可以使用 Value.CanConvert() .

y := reflect.ValueOf(x).Convert(reflect.TypeOf([]interface{}{})).Interface()

val := y.([]interface{})
fmt.Printf("%T %v\n", val, val)

这将输出(在 Go Playground 上尝试):

[1 2]
[]interface {} [1 2]

关于go - 获取 interface{ } 的值,而无需访问类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71900027/

相关文章:

java - tomcat WEB-INF 上的 jar 名称列表

Golang官方驱动中的MongoDB连接池

python - 具有长度的对象的类型

types - 如何在 Julia 中将抽象类型的子类型指定为类型参数?

c++ - 如何实例化其构造函数需要来自包含类名的字符串的参数的对象?

c# - 任何方法到 "Safely"调用 assembly.GetTypes()?

go - 如何在main.go中找到run函数的入口?

python - 写入后无法使用 go 从文件中读取字节

c - 操作系统线程是否在 go-routine 执行的 io 上被阻塞?

haskell - Haskell 中类型参数的正确类型签名