それぞれにインターフェースを実装する構造体を持ついくつかのパッケージがある小さなプログラムを作成しようとしています。アイデアは、ユーザー入力に基づいて、特定の構造体を構築するために使用するパッケージを選択し、それらすべてが持つはずの関数を呼び出すことができるということです。事前に型がわからないので、 ainterface{}
を使用してそれを前方宣言として使用できるという印象を受けました (最後のコード スニペットを参照)。次のようなものがあります。
package foo
type FooInput struct {
Bar string
Baz int
}
type Foo interface {
Ding()
Dong()
}
別のパッケージにはbob
、次のようなものがあります。
type Bob struct {
foo.FooInput
}
func (mybob *Bob) Ding() {}
func (mybob *Bob) Dong() {}
func MakeBob(foo_input foo.FooInput) (*Bob, error) {
my_bob := Bob{foo_input}
return &my_bob, nil
}
私のメインパッケージには、次のようなものがあります。
data = foo.FooInput("awyiss", 1}
var something interface{}
var err error
switch some_string {
case "foo":
something, err = bob.MakeBob(foo_input)
case "bar":
// imagine bar is like foo
something, err = bar.MakeBar(foo_input)
// imagine other cases
}
something.Dong()
/ ビルド / などを実行すると、次のエラーが発生します。
something.Dong undefined (type interface {} is interface with no methods)
私が間違っていることについて少し混乱しています...私がどのように使用すべきかについての明確化interface{}
者は、非常に役に立ちます!