use*_*740 2 polymorphism interface go
我要做的是:我有几种结构类型,都实现了相同的接口,它声明了一个方法,比如"Process()"
type Worker interface {
Process()
}
type obj1 struct {
}
func (o *obj1) Process() {
}
// same with struct type obj2, obj3, ...
Run Code Online (Sandbox Code Playgroud)
在整个代码中,我创建了这些结构的几个实例,然后我想在每个结构上调用该进程.每次调用Process()都可以正常工作.
o1 := obj1.New()
o2 := obj1.New()
o3 := obj2.New()
o4 := obj3.New()
// ...
o1.Process()
o2.Process()
// ...
Run Code Online (Sandbox Code Playgroud)
现在,我希望有一个"ProcessAll()"函数,它将接收这些实例并完成对每个实例调用Process()方法的工作,以及围绕它的一些元工作.
这是我正在尝试生成的那种代码,但是这个特定的代码段不起作用,因为我不知道该怎么做:
func ProcessAll(objs []*Worker) {
for _, obj := range objs {
obj.Process()
}
}
ProcessAll([]*Worker{o1, o2, /* ... */})
Run Code Online (Sandbox Code Playgroud)
是这样的事情可以用go完成,如果是的话我该如何实现呢?
您不需要为接口创建objs指针数组.接口是参考值.
package main
import "fmt"
type Worker interface{
Process()
}
type obj1 struct {
}
func (o *obj1) Process() {
fmt.Println("obj1 Process()")
}
type obj2 struct {
}
func (o *obj2) Process() {
fmt.Println("obj2 Process()")
}
func ProcessAll(objs []Worker) {
for _, o := range objs {
o.Process()
}
}
func main() {
ProcessAll([]Worker{ &obj1{}, &obj2{} })
}
Run Code Online (Sandbox Code Playgroud)
或者在这里查看:http://play.golang.org/p/eWXiZzrN-W