指向实现相同接口的不同结构的指针数组

时间:2013-06-12 23:30:46

标签: interface polymorphism go

我想做的是:我有几种结构类型,都实现了相同的接口,它声明了一个方法,比如说“Process()”

type Worker interface {
  Process()
}

type obj1 struct {
}

func (o *obj1) Process() {
}

// same with struct type obj2, obj3, ...

在整个代码中,我创建了这些结构的几个实例,然后我想在每个结构上调用该进程。每个调用Process()都可以正常工作。

o1 := obj1.New()
o2 := obj1.New()
o3 := obj2.New()
o4 := obj3.New()
// ...
o1.Process()
o2.Process()
// ...

现在,我希望有一个“ProcessAll()”函数,它将接收这些实例并完成对每个实例调用Process()方法的工作,以及围绕它的一些元工作。

以下是我正在尝试制作的代码,但这个特定的代码段不起作用,因为我不知道该怎么做:

func ProcessAll(objs []*Worker) {
   for _, obj := range objs {
     obj.Process()
   }
}

ProcessAll([]*Worker{o1, o2, /* ... */})

这种事情是否可以通过go完成,如果是,我该如何实现呢?

1 个答案:

答案 0 :(得分:6)

您不需要为接口创建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{} })
}

或者在此处查看:http://play.golang.org/p/eWXiZzrN-W