Go语言交易所接口管理实现困惑,请求技术帮助
多交易所API管理的Go实现修正方案
原代码的核心问题
- 接口方法名不匹配:
exchanges.Api定义的是GetBalances(),但BinanceApi和KrakenApi实现的是GetBalance(),导致结构体无法满足接口要求。 - 冗余的接口嵌套:BinanceApi和KrakenApi中嵌套
Api exchanges.Api完全多余,Go中结构体只要实现接口的所有方法,就自动成为接口的实现类型,无需显式声明"继承"。 - 接口变量声明错误:main中
var exchange *Api写法错误,接口类型本身可直接持有实现类型的实例,无需指针(除非接口方法是指针接收者)。 - 字段访问性问题:
Balance结构体的字段都是小写,属于包私有,其他模块无法访问,需要改为首字母大写导出。 - 笔误问题:KrakenApi中的client写成了
*binance.Client,应替换为Kraken对应的客户端类型。
修正后的实现代码
exchanges模块
package exchanges // 导出字段,允许其他包访问 type Balance struct { Asset string Available float64 Unavailable float64 Total float64 } // 统一接口方法名,确保实现时匹配 type Api interface { GetBalances() []Balance }
Binance模块
package binance import "your-module-path/exchanges" type BinanceApi struct { Key string Secret string Client *Client // 替换为Binance官方客户端类型 ClientFutures *FuturesClient // 替换为Binance期货客户端类型 } // 实现exchanges.Api接口的GetBalances方法,使用指针接收者 func (v *BinanceApi) GetBalances() []exchanges.Balance { // 此处可使用v.Client和v.ClientFutures获取余额数据 return []exchanges.Balance{ {Asset: "BTC", Available: 0.5, Unavailable: 0.1, Total: 0.6}, } }
Kraken模块
package kraken import "your-module-path/exchanges" type KrakenApi struct { Key string Secret string Client *Client // 替换为Kraken官方客户端类型 } // 实现exchanges.Api接口的GetBalances方法,使用指针接收者 func (v *KrakenApi) GetBalances() []exchanges.Balance { // 此处使用v.Client获取余额数据 return []exchanges.Balance{ {Asset: "ETH", Available: 2.0, Unavailable: 0.3, Total: 2.3}, } }
main.go
package main import ( "fmt" "your-module-path/exchanges" "your-module-path/binance" "your-module-path/kraken" ) func main() { // 初始化Binance实例 binanceApi := &binance.BinanceApi{ Key: "your-binance-key", Secret: "your-binance-secret", Client: binance.NewClient("key", "secret"), // 对应Binance客户端初始化方法 ClientFutures: binance.NewFuturesClient("key", "secret"), } // 初始化Kraken实例 krakenApi := &kraken.KrakenApi{ Key: "your-kraken-key", Secret: "your-kraken-secret", Client: kraken.NewClient("key", "secret"), // 对应Kraken客户端初始化方法 } // 使用接口变量,运行时自动调用对应实现 var exchange exchanges.Api // 切换为Binance实例 exchange = binanceApi balances := exchange.GetBalances() fmt.Println("Binance balances:", balances) // 切换为Kraken实例 exchange = krakenApi balances = exchange.GetBalances() fmt.Println("Kraken balances:", balances) }
关键说明
- Go的多态逻辑:无需继承,只要结构体实现了接口的所有方法,即可赋值给接口变量。调用接口方法时,会自动根据实际持有的实例类型执行对应实现,不需要类型转换。
- 指针接收者的使用:如果方法需要修改结构体内部状态,或结构体本身较大,建议使用指针接收者(如示例中的
(v *BinanceApi)),这样接口变量可持有指针类型的实例。 - 字段导出规则:需要在其他包访问的结构体字段必须首字母大写,否则属于包私有,无法被外部访问。
内容的提问来源于stack exchange,提问作者Byron Coetsee
相关产品推荐
相关产品推荐

