我正在导入两个(还有更多)外部库,它们在功能上相互关联,但又互不相同。我希望能够执行以下操作:

  • 为每个
  • 创建一个新对象
  • 将每个字段分配给嵌套结构
  • 的字段
  • 能够通过使用嵌套结构的字段
  • 访问库方法

    大概是这样的:
    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()
        }
    }
    

    在寻找答案的过程中,似乎reflect包或接口(interface)可能是我的解决方案(或两者的某种组合),但是我不是开发人员,而且对Go还是很陌生,所以Reflect有点让我头疼。

    任何帮助深表感谢!

    最佳答案

    使用界面:

    type balancer interface {
      Balance() int64
    }
    
    type data struct {
        cntr      int
        api       balancer
    }
    

    请注意,与许多其他声称具有接口(interface)的OO语言不同,
    在Go中,此概念“向后”:您可以定义任何接口(interface),然后
    确保Go运行时确保您为该自定义接口(interface)的变量分配的值是:1)满足该接口(interface)的要求,以及2)允许直接在其上调用接口(interface)方法。
    也就是说,来自任何外部代码的任何数据结构都可以
    可能不知道这一点而支持任何数量的接口(interface)。

    您可以从this开始。

    请注意,仅当两个“包装”软件包都使用指示的方法时,
    您导入的方式定义它们各自的数据类型
    相同的Balance()函数,这意味着它们必须具有相同的返回类型(或两者都没有)。

    关于generics - 如何使结构字段成为通用类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47970417/

    10-11 22:10
    查看更多