ゴーのインターフェース規則はかなり(とデザイナーが明らかに非常に多くのゲッターとセッターのアイデアを好きではなかった: - /)は、Java、たとえば、と同じように動作しません。だから、2つのコアの問題持っている:
- マップを[文字列]あなたは少しそれを打破しなければならないので、fooは、バーがfooを実装した場合でも、マップ[文字列]バーと同じではありません(使用make()を事前に実行してから、1回の割り当てで割り当てます)。
- インターフェイスメソッドはポインタなしで値によって呼び出されるため、呼び出し元で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つにはインタフェース値タイプがあります。 'map [string] MyType'から' map [string] IterableWithID'を構築するforループを書いてください。 –
私は「具体的な型のマップを、シグネチャ内のインタフェース型のマップを持つメソッドに渡す」と言っているはずです。 MyTypeはIterableWithIDを実装していますが、コンパイラはそれが無効であると言います。 – arduima
私のポイントは、値には異なる具体的な型があるということです。一方を他方に割り当てることはできません。 –