-1

それぞれにインターフェースを実装する構造体を持ついくつかのパッケージがある小さなプログラムを作成しようとしています。アイデアは、ユーザー入力に基づいて、特定の構造体を構築するために使用するパッケージを選択し、それらすべてが持つはずの関数を呼び出すことができるということです。事前に型がわからないので、 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{}者は、非常に役に立ちます!

4

2 に答える 2

2

変数somethingは空のインターフェイスとして宣言されます。空のインターフェースにはメソッドがありません。メソッドを呼び出すには、 としてDong宣言somethingfoo.Fooます。

変化する

var something interface{}

var something foo.Foo 

barこれは、似ているということは、インターフェースを満たすことをfoo意味すると想定しています。barfoo.Foo

于 2016-10-21T04:07:49.033 に答える
1

少し混乱しているように見えます。選択してください - 2 つの可能性のうちの 1 つを選択してください。変数「何か」に入れたいすべての型にメソッド Ding と Dong がある場合は、そのためのインターフェイスを定義します。Foo は最適な名前ではなく、DingDonger ( https://golang.org/doc/effective_go.html#interface-names ) の方が適切です。

後:

var something DingDonger

型に本当に必要なメソッドがあるかどうか、something への各割り当てがチェックされるため、 something.Ding() がエラーを引き起こすことはありません。

いずれかの変数が type interface{} である場合、そのようなメソッドがあるかどうかは誰にもわかりません。メソッドが実装されているかどうかを確認するには、型アサーション ( https://golang.org/doc/effective_go.html#interface_conversions ) を使用する必要があります。

于 2016-10-21T08:00:45.480 に答える