2016-09-09 15 views
-1

次のコードでcannot use map[string]MyType literal (type map[string]MyType) as type map[string]IterableWithID in argument to MapToListが得られます。具体的なマップ型をインターフェイス型を必要とするメソッドに渡すにはどうすればよいですか?map [string]のメソッドで特定の型を使用する[string] SomeInterfaceに

https://play.golang.org/p/G7VzMwrRRw

+0

どちらも具体的なマップタイプです。そのうちの1つにはインタフェース値タイプがあります。 'map [string] MyType'から' map [string] IterableWithID'を構築するforループを書いてください。 –

+0

私は「具体的な型のマップを、シグネチャ内のインタフェース型のマップを持つメソッドに渡す」と言っているはずです。 MyTypeはIterableWithIDを実装していますが、コンパイラはそれが無効であると言います。 – arduima

+0

私のポイントは、値には異なる具体的な型があるということです。一方を他方に割り当てることはできません。 –

答えて

1

ゴーのインターフェース規則はかなり(とデザイナーが明らかに非常に多くのゲッターとセッターのアイデアを好きではなかった: - /)は、Java、たとえば、と同じように動作しません。だから、2つのコアの問題持っている:

  1. マップを[文字列]あなたは少しそれを打破しなければならないので、fooは、バーがfooを実装した場合でも、マップ[文字列]バーと同じではありません(使用make()を事前に実行してから、1回の割り当てで割り当てます)。
  2. インターフェイスメソッドはポインタなしで値によって呼び出されるため、呼び出し元でfoo = foo.Method(bar)を実行するか、実際にこのようなものを実装するためにポインタがうまくいく必要があります。

    type IterableWithID interface { 
        SetID(id string) IterableWithID  // use as foo = foo.SetID(bar) 
    } 
    
    func (t MyType) SetID(id string) IterableWithID { 
        t.ID = id 
        return t 
    } 
    
    ...and to deal with the typing problem 
    
    t := make(map[string]IterableWithID) 
    t["foo"] = MyType{} 
    MapToList(t)    // This is a map[string]IterableWithID, so compiler's happy. 
    
    ...and finally... 
    
    value = value.SetID(key) // We set back the copy of the value we mutated 
    

    最終値=メソッドは、値オブジェクトの新しいコピーを取得しているという事実を扱うので:あなたは、多かれ少なかれ、あなたが欲しいものをシミュレートするために何ができる

オリジナルはあなたの方法に触れられないでしょう(変更は単に消えるでしょう)。 the Go Playground

更新されたコード...しかし、それは特に慣用ゴーではありません - 彼らは本当にTBHが、私はそれほど熱心ではないんだけれども、あなただけ(インタフェースでJavaスタイルのミューテーターを使用するのではなく、構造体のメンバを参照したいですその小さな詳細については - ミューテーターは検証を行うのに便利です)。

1

2つのマップタイプが異なるため、あなたがしたいことはできません。要素タイプが他のエレメントタイプであるインターフェースを実装するタイプであることは重要ではありません。関数に渡すマップのタイプはmap[string]IterableWithIDでなければなりません。そのタイプのマップを作成し、タイプMyTypeの値をマップに割り当て、それを関数に渡すことができます。

またhttps://play.golang.org/p/NfsTlunHkW

を参照してください、あなたはおそらくMapToListにスライスへのポインタを返すことにしたくありません。スライス自体を返します。スライスには、基になる配列への参照が含まれています。

関連する問題