我正在导入两个(还有更多)外部库,它们在功能上相互关联,但又互不相同。我希望能够执行以下操作:
大概是这样的:
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/