【问题标题】:Array of pointers to different struct implementing same interface指向实现相同接口的不同结构的指针数组
【发布时间】:2013-06-12 23:30:45
【问题描述】:

我正在尝试做的事情:我有几种结构类型,都实现了相同的接口,它们声明了一个方法,比如“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() 方法的工作,以及一些围绕它的元工作。

这是我正在尝试生成的那种代码,但是这个特殊的 sn-p 不起作用,因为我不知道该怎么做:

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

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

这种事情可以用 go 完成吗?如果可以,我该怎么做?

【问题讨论】:

    标签: interface polymorphism go


    【解决方案1】:

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

    【讨论】:

    • 更进一步,当一个类型实现一个接口时,它的指针类型也是如此
    猜你喜欢
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 2013-12-13
    相关资源
    最近更新 更多