type fn func(ctx context.Context) []string
func test(ctx context.Context) []string { return []string{"1"} }
func main() { _, ok := test.(fn) // 报错了 fmt.Println(ok) }
![]() |
1
body007 81 天前
|
![]() |
3
dcalsky 81 天前
建议用 interface 的实现来判断,如果强行判断的话,那本质是比较 function signature 。拿到 test 和 fn 的 type 然后比较即可。
```go type fn func(ctx context.Context) []string func test(ctx context.Context) []string { return []string{"1"} } func main() { if matchFunctionSignature(reflect.TypeOf(test), reflect.TypeOf((fn)(nil))) { fmt.Println(true) } else { fmt.Println(false) } } func matchFunctionSignature(a, b reflect.Type) bool { if a.Kind() != reflect.Func || b.Kind() != reflect.Func { return false } if a.NumIn() != b.NumIn() || a.NumOut() != b.NumOut() { return false } for i := 0; i < a.NumIn(); i++ { if a.In(i) != b.In(i) { return false } } for i := 0; i < a.NumOut(); i++ { if a.Out(i) != b.Out(i) { return false } } return true } ``` |
5
zhuoyue100 OP |
6
zhuoyue100 OP |
![]() |
7
CEBBCAT 81 天前
你对于 Go 的语法还需要更多学习。
正文里面的判断,在编译期就能完成,不需要在运行期完成。代码层面,也不太会有一个 map 或者 list 能够支持你做这样动态的判断,存不下。 你可以贴一下业务场景,看看是什么场景需要这样的代码设计,坛友们可以帮你看看有没有更合适的方式。以及避免 XY 问题。 关于楼上的问题,type fn 入参是 content.Context ,test()返回的函数入参是 *gin.Context ,不是一个类型,Go 目前不支持基于 interface 实现的函数替换,更常见的做法是,基于对入参 ctx 的 _, ok := ctx.(*gin.Context) 这样的判断 |
8
zhuoyue100 OP @CEBBCAT 感谢,_, ok := ctx.(*gin.Context) 这种可以实现我的需求,但是后续有其他的 content.Context 实现类型那就要在写一个判断了。 你刚才说的 ”目前不支持基于 interface 实现的函数替换” 对我很有用
|