You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言交易所接口管理实现困惑,请求技术帮助

多交易所API管理的Go实现修正方案

原代码的核心问题

  1. 接口方法名不匹配:exchanges.Api定义的是GetBalances(),但BinanceApi和KrakenApi实现的是GetBalance(),导致结构体无法满足接口要求。
  2. 冗余的接口嵌套:BinanceApi和KrakenApi中嵌套Api exchanges.Api完全多余,Go中结构体只要实现接口的所有方法,就自动成为接口的实现类型,无需显式声明"继承"。
  3. 接口变量声明错误:main中var exchange *Api写法错误,接口类型本身可直接持有实现类型的实例,无需指针(除非接口方法是指针接收者)。
  4. 字段访问性问题:Balance结构体的字段都是小写,属于包私有,其他模块无法访问,需要改为首字母大写导出。
  5. 笔误问题: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 16:10:24