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

Interface 指向实现同一接口的不同结构的指针数组,interface,polymorphism,go,Interface,Polymorphism,Go,我要做的是:我有几个结构类型,都实现了相同的接口,它们声明了一个方法,比如“Process() 在整个代码中,我创建了这些结构的几个实例,然后我想对每个结构调用流程。对每个进程调用Process()可以正常工作 o1 := obj1.New() o2 := obj1.New() o3 := obj2.New() o4 := obj3.New() // ... o1.Process() o2.Process() // ... 现在,我想要一个“ProcessAll()”函数,它将接收这些实例,并

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

在整个代码中,我创建了这些结构的几个实例,然后我想对每个结构调用流程。对每个进程调用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是否可以完成这类事情,如果可以,我该如何实现它?

您不需要创建指向接口的指针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{} })
}

或者在这里查看:

更进一步,当类型实现接口时,其指针类型也会实现接口
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{} })
}