golang中的函数接口
考虑接受函数作为参数的函数:golang中的函数接口,go,Go,考虑接受函数作为参数的函数: func f(arg func(I)){} 其中I是接口 是否有任何方法可以将签名func(*T)的参数传递给上述函数,其中T实现I接口 现在,当我传递它时,我有一个错误: cannot use (type func(*T)) as type func(I) in argument 这里是运动场: 用例如下所示: 我编写的包具有f(a func(I),b I)函数。然后用户将其作为库导入 作为下一步,用户将定义一个实现I接口的自定义类型T,以及一个带有签名fu
func f(arg func(I)){}
其中I
是接口
是否有任何方法可以将签名func(*T)
的参数传递给上述函数,其中T
实现I
接口
现在,当我传递它时,我有一个错误:
cannot use (type func(*T)) as type func(I) in argument
这里是运动场:
用例如下所示:
我编写的包具有f(a func(I),b I)
函数。然后用户将其作为库导入
作为下一步,用户将定义一个实现I
接口的自定义类型T
,以及一个带有签名func(*T)
的自定义函数。然后用户将调用库f
函数:
f(customFunction, customObject)
反过来,包将接收它并创建一个goroutine:
go customFunction(customObject)
goroutine之所以在“内部”包中创建,是因为goroutine编排应该被“隐藏”起来 不,类型需要精确。您的示例尤其不完整,因为
I
不一定可以转换为*t
,但它也不能以其他方式工作。如果您确定传递给您的函数的I
的类型是*T
,您可以创建包装函数并传递它
func wrapper(i I) {
t := i.(*T)
myRealFunc(t)
}
也许你可以用它来转换,但这取决于你的情况。如果我们只知道你想通过你的问题实现什么,我们可以更好地分享approach@xpare谢谢你,我添加了用例。你可以使用反射来实现你想要的效果,但这将非常复杂,我确信这是不必要的。例如,如果您正在执行的唯一操作是调用
go customFunction(customObject)
只需进行签名func()
,并期望调用方传递闭包。进一步扩展您的用例(如完整代码),我可以提供更多帮助。但最简单的解决方案是客户端传入func(I)
,并在内部键入assert to*T
,就像我回答中的包装器代码一样。我不能确定t
类型,因为它将在用户空间中定义,而myRealFunc
将是库函数。我更新问题/