2017-12-25 11 views
0

機能的には関係がありますが、互いに異なる2つ(と今後の予定)の外部ライブラリをインポートしています。私は、次の操作を実行できるようにしたいと思います:構造体フィールドをジェネリック型にする方法

  • ネストされた構造体
  • のフィールドにそれぞれ割り当てる各
  • の新しいオブジェクトを作成し、ネストされたを使用して、ライブラリのメソッドにアクセスすることができ構造体のフィールド大雑把

このような何か:答えのための私の検索で

import (
    "github.com/bittrex_api_wrapper" 
    "github.com/kraken_api_wrapper" 
) 

type Exchange struct { 
    bittrex  *data 
    kraken  *data 
} 

type data struct { 
    cntr  int 
    api  ????  
} 

func Initialize() Exchange { 
    e Exchange 

    brex := bittrex_api_wrapper.New("APIKEY1", "SECRET1") 
    krak := kraken_api_wrapper.New("APIKEY2", "SECRET2") 

    brexData := data { 
     cntr: 0, 
     api:  brex, 
    } 
    krakData := data { 
     cntr: 0, 
     api:  krak, 
    } 
    e = Exchange { 
     bittrex: brexData, 
     kraken:  krakData, 
    } 

    return e 
} 

func (e *Exchange) CheckBalance(exng string) float64 { 
    switch exng { 
     case "kraken": 
      return e.kraken.api.Balance() 
     case "bittrex": 
      return e.bittrex.api.Balance() 
    } 
} 

、それはのように思えますリフレクションパッケージやインターフェイスが私の解決策(またはその2つの組み合わせ)かもしれませんが、私は開発者ではなく、Go to newですので、Reflectは私の頭を少し上回りました。

ご協力いただきありがとうございます。

+0

投稿したソースから正確にどのように動作させるかは分かりません。両方のAPIをすべての 'Exchange'オブジェクトで利用できるようにする必要がありますか?しかし、私は98%あなたがこれについてのリフレクションを必要としないと言うことができます。 – Adrian

答えて

2

使用インターフェース:彼らはインターフェース、移動中 を持っていると主張、他の多くのオブジェクト指向言語とは異なり、このコンセプトは「後ろ向きである」という

type balancer interface { 
    Balance() int64 
} 

type data struct { 
    cntr  int 
    api  balancer 
} 

注:あなたは、任意のインターフェイスを定義することができ、その後 が作ります実行時には、そのカスタムインターフェイスの変数に割り当てる値がそのインターフェイスを満たしていること、および(2)インターフェイスメソッドを直接呼び出すことができることを確認してください。 つまり、任意の外部コードからのデータ構造は、これに気づかずに任意の数のインタフェースをサポートする可能性があります。

thisから始まる場合があります。指示されたアプローチが唯一の場合、両方の「ラッパー」のパッケージが あなたは、彼らがBalance() 同一の機能を有するように、それぞれのデータ型を定義インポートし、これは、彼らが同じリターンを持っていなければならないことを意味動作することを

注意タイプ(または両方を持たない)。

関連する問題