在 Go 中将任意函数作为参数传递
在 Go 中将函数作为参数传递允许动态创建和执行代码。但是,可以传递的函数类型是有限制的。
考虑以下场景:我们想要创建一个装饰器函数,它可以包装任何接受一个参数并返回单个值的函数。为了处理接受或返回interface{}类型的函数,我们可以定义一个以func(interface{})interface{}作为参数的装饰器函数。
但是,不可能转换func类型的函数(string) string 隐式转换为 func(interface{}) interface{} 类型。这是因为函数之间的参数和返回类型机制不同。传递 interface{} 参数并不能保证与所有类型的兼容性。
例如,接受结构体作为参数的函数将接收该结构体的各个成员。相反,接受包含该结构的接口{}的函数将接收两个单词:一个表示类型,一个表示指向结构的指针。
解决方案
如果没有泛型,就没有直接的方法来实现此功能。但是,我们可以使用适配器函数作为解决方法:
// Adapter function for func(string) string to func(interface{}) interface{} func adapter(inner func(string) string) func(interface{}) interface{} { return func(arg interface{}) interface{} { // Convert the interface{} arg to a string argString := arg.(string) // Call the inner function with the converted string result := inner(argString) // Return the result return result } }
现在,我们可以使用适配器函数将 funcB 传递到装饰器中:
fmt.Println(decorate(adapter(funcB), "(This is B's argument)"))
以上是考虑到类型兼容性限制,如何在 Go 中将任意函数作为参数传递?的详细内容。更多信息请关注PHP中文网其他相关文章!