亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果接口變量的類型是別名,如何測試接口變量的基礎類型

如果接口變量的類型是別名,如何測試接口變量的基礎類型

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 關注
  • 174 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號