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
将是库函数。我更新问题/