2017-01-03 4 views
0

いくつかの構造体といくつかの関数をエクスポートするパッケージを想像してください。ゴランにパッケージを入れる

そのパッケージの周りにラッパーを作ってドロップインとして使用できるようにするには、古い構造体が埋め込まれた構造体を再作成する必要がありますか?例:

package foo 

type Foo struct { 
    Field string 
} 

func DoSomething() { 

} 

package bar 

import foo 

type Foo struct { 
    foo.Foo 
} 

func DoSomething() { 
    foo.DoSomething() 
} 

は、より良い方法はありますか?これは慣用的なやり方ですか?

+0

最も慣用的なアプローチは、net/httpの 'Handler'のように、ドロップインタイプが満たす必要があるメソッドを記述するinterface {}型を定義することです。 – Nadh

+0

残念ながら、インターフェイスは構造体のメソッドに対してのみ機能し、パッケージスコープ付きの関数に対しては機能しません。 –

+1

あなたは何をする必要があるか分かっているようです - エクスポートされたすべてのシンボルをミラー化する必要があります。埋め込みは自動委任の一形態に過ぎないため、どこで動作させるかを手動で行うことができます。ここには魔法はありません。 – JimB

答えて

0

これは慣用的な方法です。魔法はありません。

1

だと思います。元のパッケージを使用するだけで、独自のバージョンを使用する場合はエイリアスを使用できます。

さんは現在、あなたのコードを言ってみましょうです:あなたは別名によってバーでインポートをFOOを置き換えることができます

import (
    "abc.com/package/foo" 
) 

func CallFoo() { 
    foo.DoSomething() 
} 

、他のコードは同じまま。

import (
    foo "abc.com/package/bar" // this is alias 
) 

func CallFoo() { 
    foo.DoSomething() 
} 
+0

はい、私の質問はパッケージのデザインに関するものでした。 –

+1

前のパッケージと同じインターフェースを持つ新しいパッケージを作成したいのですか? その場合は、新しいパッケージで何をしたいかによって異なります。あなたの質問から、機能が同じであるので、新しいパッケージを作成する必要はないようです。同じでない場合は、新しいパッケージを書くのと同じインターフェースを使用して、好きなことをすることができます。 –

関連する問題