【发布时间】:2019-03-20 09:32:56
【问题描述】:
考虑这样一个接受函数作为参数的函数:
func f(arg func(I)){}
I 是接口。
有什么方法可以将签名func(*T) 的参数传递给上述函数,其中T 实现I 接口。
现在当我通过它时,我有一个错误:
cannot use (type func(*T)) as type func(I) in argument
这里是游乐场: https://play.golang.org/p/7vilY4zkEzf
用例如下:
我编写了具有f(a func(I), b I) 功能的包。然后用户将其作为库导入。
下一步,用户将定义一个实现I 接口的自定义类型T 和一个带有签名func(*T) 的自定义函数。然后用户将调用库f函数:
f(customFunction, customObject)
反过来,package 会接收它并创建一个 goroutine:
go customFunction(customObject)
goroutine 在“内部”包中创建的原因是 goroutine 编排应该在“底层”进行。
【问题讨论】:
-
也许你可以使用reflect 来转换它,但这真的取决于你的情况。如果我们只知道您要解决的问题,我们可以分享更好的方法
-
@xpare 谢谢,我添加了用例。
-
您可以使用反射来使这项工作按您的意愿进行,但这会非常复杂,我非常相信这没有必要。就像如果你唯一要做的就是调用
go customFunction(customObject)只需签名func()并期望调用者传递一个闭包。进一步扩展您的用例(如完整代码),我可以提供更多帮助。 -
但最简单的解决方案是让客户端传入
func(I)并在内部将assert 键入*T,就像我回答中的包装代码一样。
标签: go