【问题标题】:Interface of function in golanggolang中的函数接口
【发布时间】: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


【解决方案1】:

不,类型必须准确。你的例子特别糟糕,因为I 不能绝对转换为*T,但它也不会以其他方式工作。如果您确定传递给函数的I 的类型是*T,则可以创建包装函数并改为传递它。

func wrapper(i I) {
  t := i.(*T)
  myRealFunc(t)
}

【讨论】:

  • 我不能确定 T 类型,因为它将在用户空间中定义,而 myRealFunc 将是库函数。我更新了问题/
猜你喜欢
  • 1970-01-01
  • 2018-03-22
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 2016-07-07
  • 1970-01-01
  • 2017-12-03
相关资源
最近更新 更多