第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

如何通過反射將函數(shù)斷言為類型?

如何通過反射將函數(shù)斷言為類型?

Go
守著一只汪 2023-05-22 17:41:35
我正在用 Go 編寫一個 RPC 服務(wù)。我不知道如何將結(jié)構(gòu)方法轉(zhuǎn)換為Handler函數(shù)。我嘗試了什么:type TestService struct{}func (TestService) Foo(a int) error {    return nil}type Handle func(a int) errorfunc TestHandle(t *testing.T) {    ts := new(TestService)    val := reflect.ValueOf(ts)    // typ := reflect.TypeOf(ts)    // fmt.Println(val.Method(0).Interface())    // fmt.Println(val.Method(0).Type().ConvertibleTo(reflect.TypeOf(new(Handle))))    switch reflect.Indirect(val).Method(0).Interface().(type) {    case Handle:        fmt.Println(" okokok " )    default:        fmt.Println(reflect.Indirect(val).Method(0).Type())    }}但它失敗了。我應(yīng)該怎么做?
查看完整描述

1 回答

?
明月笑刀無情

TA貢獻(xiàn)1828條經(jīng)驗 獲得超4個贊

該方法TestService.Foo屬于 type func(a int) error,它與 type 不同Handle(Handle具有相同的基礎(chǔ)類型,但它是一種新的、不同的類型)。


您必須檢查此確切類型:


case func(a int) error:

? ? fmt.Println(" okokok ")

通過此更改,輸出將是:


=== RUN? ?TestHandle

?okokok?

--- PASS: TestHandle (0.00s)

PASS

在Go Playground上嘗試一下。

請注意,您可以對類型斷言執(zhí)行相同的操作,例如:

if?_,?ok?:=?reflect.Indirect(val).Method(0).Interface().(func(a?int)?error);?ok?{
????fmt.Println("?okokok?")
}

在Go Playground試試這個。

另請注意,如果您確實想使用Handle類型定義,則可以檢查函數(shù)值是否可分配給類型變量Handle。使用反射,此檢查本質(zhì)上意味著方法的類型是否可分配給Handle.

這就是它的樣子:

th?:=?reflect.TypeOf(Handle(nil))if?reflect.Indirect(val).Method(0).Type().AssignableTo(th)?{
????fmt.Println("?okokok?")
}

在Go Playground試試這個。

獲取函數(shù)值

上面的解決方案只檢查給定的方法是否屬于給定的函數(shù)類型。如果你還需要函數(shù)值(這樣你就可以調(diào)用它),你可以這樣做:

使用類型切換時(Go Playground):

switch?hf?:=?reflect.Indirect(val).Method(0).Interface().(type)?{
case?func(a?int)?error:
????fmt.Println("?okokok?",?hf(0))default:
????fmt.Println(reflect.Indirect(val).Method(0).Type())
}

使用類型斷言時(Go Playground):

if?hf,?ok?:=?reflect.Indirect(val).Method(0).Interface().(func(a?int)?error);?ok?{
????fmt.Println("?okokok?",?hf(0))
}

使用Value.Convert()去游樂場):

m?:=?reflect.Indirect(val).Method(0)
th?:=?reflect.TypeOf(Handle(nil))if?m.Type().AssignableTo(th)?{?
???var?hf?Handle?=?m.Convert(th).Interface().(Handle)
????fmt.Println("?okokok?",?hf(0))
}


查看完整回答
反對 回復(fù) 2023-05-22
  • 1 回答
  • 0 關(guān)注
  • 155 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號