如何使struct字段成为泛型类型

时间:2017-12-25 16:37:41

标签: generics go struct

我正在导入两个(以及更多)来自外部库的外部库,这些外部库在功能上相互关联,但彼此不同。我希望能够做到以下几点:

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

大概是这样的:

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()
    }
}

在我寻找答案时,似乎反射包或界面可能是我的解决方案(或两者的某种组合),但我不是开发人员而且是Go的新手,所以Reflect是有点过头了。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

使用界面:

type balancer interface {
  Balance() int64
}

type data struct {
    cntr      int
    api       balancer
}

请注意,与许多声称具有接口的其他OO语言不同, 在Go中,这个概念"向后":可以定义任何界面然后 使Go运行时确保您分配给该自定义接口1)的变量的值满足该接口,并且2)允许直接调用其上的接口方法。 也就是说,来自任何外部代码的任何数据结构都可以 可能支持任意数量的接口而不了解这一点。

您可以从this开始。

请注意,指示的方法仅适用于如果两者"包装"包 您导入以他们拥有的方式定义各自的数据类型 相同的 Balance()函数,这意味着它们必须具有相同的返回类型(或者两者都没有)。