Go语言:不改变函数行为,如何限制RegisterHandler的参数类型?
问题说明
已有部分回答建议修改RegisterHandler函数的签名,但原问题是询问能否进一步限制类型,而非寻求设计建议。修改签名会改变函数行为,因此并非合适的解决方案。
现有代码实现
我有如下形式的函数:
func (c *Context) RegisterHandler(f interface{}) error { // 执行大量检查,确保传入的是函数,且其所有参数都实现了特定接口 } func consumer(a ConcreteTypeA, b ConcreteTypeB) {} func main() { ... c.RegisterHandler(consumer) }
其大致执行逻辑等价于:
var a ConcreteTypeA var b ConcreteTypeB a.InitFromContext(c) b.InitFromContext(c) consumer(a, b)
核心疑问
能否在不改变函数行为的前提下,将上述的interface{}参数类型定义得更具体?如果不行,我对当前方案也较为满意,只是希望减少运行时检查,避免编译阶段未发现的bug。
尝试过的方案
我当前的实现与上述代码类似,曾尝试如下写法:
func (c *Context) RegisterHandler(f func (...InitFromContexter)) error { // 执行大量检查,确保传入的是函数,且其所有参数都实现了特定接口 }
但这会导致现有代码全部失效,因为该写法仅接受可变参数函数。
内容的提问来源于stack exchange,提问作者Masa Maeda
相关产品推荐
相关产品推荐

