我想知道这是否是在Go中完成的,或者我认为这一切都是错的:编写type x interface
和type x struct
所以我的接口方法也可以访问特定数据:< / p>
我的C程序员希望这样做:
type PluginHandler interface {
onLoad()
pm *PluginManager
}
func (ph PluginHandler) onLoad() {
pm.DoSomething()
}
我有一个用函数定义的接口,但是我想传递给那些函数的一些数据,但这是一个语法错误。
这是通过其他方法实现的,或者我只是在考虑问题是错误的吗?
答案 0 :(得分:2)
您错误地定义了onLoad
。您无法直接在接口类型上定义函数。
一旦有了接口,就需要另一种类型来实现接口中指定的方法。例如,如果另一个类型实现onLoad
方法,它们会自动(隐式)实现接口PluginHandler
。
您需要做的另一件事是更改接口函数类型以接受所需的数据:
type PluginHandler interface {
onLoad(*PluginManager)
}
struct SomeType {
// ...
}
func (s SomeType) onLoad(pm *PluginManager) { // SomeType now implements
pm.DoSomething() // PluginHandler interface.
}
通过这种方式,您可以注入PluginManager
所需的PluginHandler
。
此外,您可以SomeType
使用PluginHandler
类型。
func someFuntion(ph PluginHandler) {
// ...
ph.onLoad(pm)
// ...
}
可以使用类型为SomeType
的输入参数调用:
s := SomeType{}
someFunction(s)
答案 1 :(得分:1)
TL; DR; 没有直接翻译为Go。
答案很长:
Go接口只是 方法。
Go结构只是 数据(可能有接收方法)。
您可以在结构中引用,甚至嵌入接口:
type Frobnicator interface {
Frobnicate() error
}
type Widget struct {
Frobnicator
WidgetName string
}
但那不是你所说的。
你的困境的最佳答案是,我相信:退后一步。你专注于树木,你需要看看森林。 Go采用与C不同的方法,或者像C ++和Java这样的经典OO语言。
看看要解决的一般问题,并在Go中找到解决方案。这可能是一个痛苦的过程(我可以从经验中说),但它确实是学习新思维方式的唯一方法。
答案 2 :(得分:0)
仅为记录,您可以通过引入另一个(间接)类型为现有类型添加额外的方法:
type HandlerManager PluginManager
func (x *HandlerManager) onLoad() {
((*PluginManager)(x)).DoSomething()
}
如果您需要使用更通用的解决方案,可以使用Adapter&amp; amp;战略模式可以做到:
type PluginHandlerAdapter struct{ _onLoad func() }
func (x *PluginHandlerAdapter) onLoad() {
x._onLoad()
}
像(忽略公共/私人访问)一样使用:
type PluginManager struct {
PluginHandlerAdapter
}
func NewPluginManager() *PluginManager {
res := new(PluginManager)
res._onLoad = res.DoSomething
return res
}