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 類型。
- 1 回答
- 0 關注
- 174 瀏覽
添加回答
舉報
0/150
提交
取消