登录
首页 >  Golang >  Go问答

无需访问类型即可提取 interface{} 的值

来源:stackoverflow

时间:2024-02-13 09:03:26 336浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《无需访问类型即可提取 interface{} 的值》,涉及到,有需要的可以收藏一下

问题内容

如何获取 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 具体类型仅适用于存储在接口值中的确切 (identical) 具体类型,您不能键入断言“相似”类型(例如具有相同基础类型的类型)。

在您的情况下,您想要的是获取可转换为已知类型的值(例如,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]

今天关于《无需访问类型即可提取 interface{} 的值》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>