2016-11-13 5 views
2

私はGoで解決する方法がわからないという問題があります。私はjsonベースのapiと会話するクライアントを作る必要があります。構成が異なる複数の構造体

私は以下のような構造体を構築するためにcompositionを使用すると考えました。

type (
    BaseData struct { 
     CommonFields string 
    } 

    Data struct { 
     BaseData 
     Result string 
    } 
) 

私はデータ構造体をAPIに送信し、結果に対するレスポンスを非マーシャルすることになりました。

ここで問題となるのは、異なる「結果」構成を必要とする送信要求が異なるため、同じパッケージ内に多くのデータ構造体の定義が必要であるということです。

私はこれをどうやってやるべきか見て苦労しています。ある方向のポインタはすばらしいでしょう。

+0

"同じパッケージ内のデータ構造体の多くの定義を必要としますが、これは良いことではありません"という前提があります。その仮定を破棄し、コーディングを開始してください。 – Volker

+0

これは大丈夫だと言っていますか?私はそれを私が読んだドキュメントで見つけることはできません。可能であれば、問題に取り組むのが正しい方法なのでしょうか、正方形のペグのことをしようとしていますか? –

+0

「結果」という意味は、あなたの 'Data'構造体の' Result string'変数ですか? 'はい'の場合、 'result {}のデータ型として' interface {} 'を使うことができます。 –

答えて

0

使用するAPIをミラー化または模倣するモデル構造を作成しないでください。 の高い概念レベルでは、 とSOLID principlesの実装レベルで、プログラムに合ったモデルを設計します。おそらく

  • あなたが外国APIのすべての機能を必要としません。あまりにも多くの構造を堅持することで、あなたのプログラムで独自の目的を果たさない多くの定型文を実装します。
  • 外部APIのわずかな変更のためにプログラムが中断しないようにします。

外部APIと通信するためのプログラム内にレイヤーを作成し、 とし、残りのプログラムをこのレイヤーに依存させます。外部APIを直接使用することはできません。 このようにして、APIで何か変更があった場合は、通信レイヤーを変更するだけで、残りのプログラムは影響を受けずに作業を続けることができます。

この通信レイヤでは、APIと通信するために必要な構造を使用します。 不要な構造は使用しないでください。 これらの構造体を残りのプログラムで使用される構造体に変換します。 これは多くの手作業によるコピーが含まれていることがあります。最初はかなり見えないかもしれませんが、 ですが、これは外部からの変更からプログラムを保護する方法です。

+0

リンクのおかげで、これらの記事を読んでいただきます。このAPIの目標は、効率的にそれと話をし、他の人が使用できる構造体をハンドオフすることです。 –