2016-10-21 4 views
-1

私はいくつかのパッケージを持ち、それぞれがインターフェイスを実装する構造体を持つ小さなプログラムを作成しようとしています。アイデアは、ユーザーの入力に基づいて、私は特定の構造体を構築するために使用するパッケージを選択し、それからそれらが持つべきすべての機能を呼び出します。前もってタイプが分からないので、私はinterface{}を使用してそれをフォワード宣言(最後のコードスニペットを参照)として使用できるという印象を受けました。私はこのようなものがあります。構造体を作成するときにインターフェイスを正しく使用する

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() 
:私はそうのように見える何かを持って、私のメインのパッケージで

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 
} 

:別のパッケージ、bob

package foo 

type FooInput struct { 
    Bar string 
    Baz int 
} 

type Foo interface { 
    Ding() 
    Dong() 
} 

を、私のようなものを持っています

/building/etcを実行すると、次のエラーが表示されます。

something.Dong undefined (type interface {} is interface with no methods) 

私は間違っていることについてちょっと混乱しています...どのように私がinterface{}(もしかして)を使うべきかについての明確化者は非常に役に立つでしょう!

答えて

2

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

変更

var something interface{} 

var something foo.Foo 

これはbarfooようであることがbarfoo.Fooインタフェースを満たすことを意味することを想定しています。

+0

私は問題をよりよく説明しようとしましたが、私の最後の編集を見てください –

1

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

var something DingDonger 

それぞれ何かに割り当てるには、タイプが本当に必要なメソッドを持っているので、()をsomething.Dingするとエラーが発生することができないかどうか、チェックされます。

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

関連する問題