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)) }
- 1 回答
- 0 關(guān)注
- 155 瀏覽
添加回答
舉報