为了账号安全,请及时绑定邮箱和手机立即绑定

如何将接口{}转换为其底层类型

如何将接口{}转换为其底层类型

Go
天涯尽头无女友 2021-07-15 18:01:50
我将一个二维字符串切片传递到一个函数 test 中,该函数可以接受可变参数,并且在 test() 中我可以获得第一个参数的基础类型,但是如何将其转换回其基础类型?因为我必须迭代它的底层类型我不喜欢硬编码它:if reflect.TypeOf(args[0]).String() == "[][]string" {    val := args[0].([][]string)}问题是如果我知道它的类型字符串是“[][]string”或其他东西,我该如何将其转换为类型?我在这里发布了完整的代码,并添加了一些注释:package mainimport (    "reflect"    "fmt")func test(args ...interface{}) {    fmt.Println("type", reflect.TypeOf(args[0]))    // here will be a compile error, because args[0]'type now is interface{},     // not a slice, though it's underlying type is slice    for i, v := range args[0] {        }    // so, how could I convert args[0] to [][]string when I get its type     // string "[][]string" ?    // I know use type assertion is possible, but you must guess the possible     // type the args[0] will be.    // is there a way to do it from a type's string representation to the     // actual type?    // so I can write code like this:     // val := args[0].(reflect.TypeOf(args[0]).String()), which is very general}func main() {    arr := [][]string{{"asd", "sd", "rt"}, {"34","gf","gf"}}    test(arr)}
查看完整描述

3 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

不能为类型断言使用动态值,因此

foo.(reflect.TypeOf(bar))

或类似的东西将不起作用。这是因为类型不是一等公民,不能存储在变量中。

你总是必须明确地写出你希望接口值是哪种类型,要么使用类型断言,要么使用类型开关。


查看完整回答
反对 回复 2021-07-19
  • 3 回答
  • 0 关注
  • 195 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信