我正在导入两个(以及更多)来自外部库的外部库,这些外部库在功能上相互关联,但彼此不同。我希望能够做到以下几点:
大概是这样的:
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是有点过头了。
非常感谢任何帮助!
答案 0 :(得分:2)
使用界面:
type balancer interface {
Balance() int64
}
type data struct {
cntr int
api balancer
}
请注意,与许多声称具有接口的其他OO语言不同, 在Go中,这个概念"向后":你可以定义任何界面然后 使Go运行时确保您分配给该自定义接口1)的变量的值满足该接口,并且2)允许直接调用其上的接口方法。 也就是说,来自任何外部代码的任何数据结构都可以 可能支持任意数量的接口而不了解这一点。
您可以从this开始。
请注意,指示的方法仅适用于如果两者"包装"包
您导入以他们拥有的方式定义各自的数据类型
相同的 Balance()
函数,这意味着它们必须具有相同的返回类型(或者两者都没有)。