Golang新手在这里。
这个问题的简短版本是:给定一个可能是别名类型的接口值,检查它是否属于底层类型的正确方法是什么?
我发现类型断言和类型切换不起作用。
例如,在下面的程序中,我有一堆Alias<N>从底层类型自动生成的命名类型Origin。我有一个接口变量v,它可以是任何类型。如果是 type ,我想使用它的Field值。vOrigin
package main
import (
"fmt"
)
type Origin struct {
Field int
}
type Alias1 Origin
type Alias2 Origin
type Alias3 Origin
// A bunch of other aliases
func 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: 10
No... Alias2 Value: 10
panic: interface conversion: interface is main.Alias3, not main.Origin
正确的方法是什么?(我无法列出 in 的所有别名类型,Origin因为f这些别名类型是自动生成并分散在各处的。)非常感谢任何帮助。提前致谢!
智慧大石
相关分类