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

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

如何通過反射將函數斷言為類型?

如何通過反射將函數斷言為類型?

Go
守著一只汪 2023-05-22 17:41:35
我正在用 Go 編寫一個 RPC 服務。我不知道如何將結構方法轉換為Handler函數。我嘗試了什么: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())    }}但它失敗了。我應該怎么做?
查看完整描述

1 回答

?
明月笑刀無情

TA貢獻1828條經驗 獲得超4個贊

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


您必須檢查此確切類型:


case func(a int) error:

? ? fmt.Println(" okokok ")

通過此更改,輸出將是:


=== RUN? ?TestHandle

?okokok?

--- PASS: TestHandle (0.00s)

PASS

在Go Playground上嘗試一下。

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

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

在Go Playground試試這個。

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

這就是它的樣子:

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

在Go Playground試試這個。

獲取函數值

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

使用類型切換時(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))
}


查看完整回答
反對 回復 2023-05-22
  • 1 回答
  • 0 關注
  • 157 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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