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

如果接口变量的类型是别名,如何测试接口变量的基础类型

如果接口变量的类型是别名,如何测试接口变量的基础类型

Go
Cats萌萌 2022-03-03 16:09:13
Golang新手在这里。这个问题的简短版本是:给定一个可能是别名类型的接口值,检查它是否属于底层类型的正确方法是什么?我发现类型断言和类型切换不起作用。例如,在下面的程序中,我有一堆Alias<N>从底层类型自动生成的命名类型Origin。我有一个接口变量v,它可以是任何类型。如果是 type ,我想使用它的Field值。vOriginpackage mainimport (    "fmt")type Origin struct {    Field int}type Alias1 Origintype Alias2 Origintype Alias3 Origin// A bunch of other aliasesfunc f(v interface{}) {    if _, ok := v.(Origin); ok {        fmt.Println("type assertion works")    }    switch v := v.(type) {    case Origin:        fmt.Println("type switch works")    case Alias1:        fmt.Printf("No... Alias1 Value: %v\n", v.Field)    case Alias2:        fmt.Printf("No... Alias2 Value: %v\n", v.Field)    default:        fmt.Printf("No... Alias3 Value: %T\n", v.(Origin).Field)    }}func main() {    f(Alias1{Field: 10})    f(Alias2{Field: 10})    f(Alias3{Field: 10})}输出如https://play.golang.org/p/3WjpX6NcfF所示:No... Alias1 Value: 10No... Alias2 Value: 10panic: interface conversion: interface is main.Alias3, not main.Origin正确的方法是什么?(我无法列出 in 的所有别名类型,Origin因为f这些别名类型是自动生成并分散在各处的。)非常感谢任何帮助。提前致谢!
查看完整描述

1 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

我能得到的最短的是:

fmt.Printf("Value: %v\n", reflect.ValueOf(v).Convert(ot).Interface().(Origin).Field)

(而不是代码中的第三个 fmt)

它使用反射将 v 转换为原始类型。但随后要使用类型断言,但那将是reflect.Value。要将其转换为 Origin 类型,需要将其转换为 interface{} ,然后可以将其类型断言为 Origin 类型。


查看完整回答
反对 回复 2022-03-03
  • 1 回答
  • 0 关注
  • 145 浏览
慕课专栏
更多

添加回答

举报

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