3

私がやろうとしていること: 私はいくつかの構造体型を持っています。それらはすべて同じインターフェースを実装しており、メソッドを宣言しています。

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()
// ...

ここで、これらのインスタンスを受け取り、それらのそれぞれで Process() メソッドを呼び出すジョブと、それを回避するいくつかのメタワークを実行する「ProcessAll()」関数が必要です。

これが私が作成しようとしているコードの種類ですが、この特定のスニペットは、方法がわからないため機能しません。

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

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

そのようなことはgoで達成できますか?もしそうなら、どうすれば実装できますか?

4

1 に答える 1

7

インターフェイスへのポインターの 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

于 2013-06-12T23:35:06.453 に答える