使用Go语言对接全球股票数据API实践指南
概述
本文介绍如何通过Go语言对接支持多国股票数据的API服务。我们将基于提供的API文档,实现包括市场行情、K线数据、实时推送等核心功能的对接。
一、准备工作
1. 获取API Key
联系服务提供商获取访问密钥(替换下文中的YOUR_API_KEY
)
2. 安装依赖
go get github.com/go-resty/resty/v2 # HTTP客户端
go get github.com/gorilla/websocket # WebSocket支持
二、核心功能实现
1. 获取指定国家市场列表
package mainimport ("fmt""github.com/go-resty/resty/v2"
)type MarketResponse struct {Code int `json:"code"`Message string `json:"message"`Data struct {Records []struct {ID int `json:"id"`Symbol string `json:"symbol"`Last float64 `json:"last"`Chg float64 `json:"chg"`ChgPct float64 `json:"chgPct"`Volume int64 `json:"volume"`} `json:"records"`} `json:"data"`
}func GetStockList(countryID int) {client := resty.New()resp, err := client.R().SetQueryParams(map[string]string{"countryId": fmt.Sprintf("%d", countryID),"pageSize": "10","page": "1","key": "YOUR_API_KEY",}).Get("https://api.stocktv.top/stock/stocks")var result MarketResponseif err := json.Unmarshal(resp.Body(), &result); err != nil {fmt.Println("解析错误:", err)return}fmt.Printf("获取到 %d 条市场数据\n", len(result.Data.Records))for _, stock := range result.Data.Records {fmt.Printf("%s 最新价: %.2f 涨跌幅: %.2f%%\n", stock.Symbol, stock.Last, stock.ChgPct)}
}
2. 获取股票K线数据
type KLine struct {Time int64 `json:"time"`Open float64 `json:"open"`Close float64 `json:"close"`High float64 `json:"high"`Low float64 `json:"low"`Volume int64 `json:"volume"`
}func GetKLineData(pid int, interval string) {client := resty.New()resp, _ := client.R().SetQueryParams(map[string]string{"pid": fmt.Sprintf("%d", pid),"interval": interval,"key": "YOUR_API_KEY",}).Get("https://api.stocktv.top/stock/kline")var klines []KLineif err := json.Unmarshal(resp.Body(), &klines); err != nil {fmt.Println("K线数据解析失败:", err)return}fmt.Println("\nK线数据:")for _, k := range klines {fmt.Printf("[%s] O:%.2f H:%.2f L:%.2f C:%.2f\n",time.Unix(k.Time/1000, 0).Format("2006-01-02 15:04"),k.Open, k.High, k.Low, k.Close)}
}
3. WebSocket实时数据订阅
func ConnectWebSocket() {conn, _, err := websocket.DefaultDialer.Dial("wss://ws-api.stocktv.top/connect?key=YOUR_API_KEY", nil)if err != nil {log.Fatal("连接失败:", err)}defer conn.Close()// 订阅股票(示例订阅pid=7310)subscribeMsg := `{"action":"subscribe","pids":[7310]}`if err := conn.WriteMessage(websocket.TextMessage, []byte(subscribeMsg)); err != nil {log.Fatal("订阅失败:", err)}for {_, message, err := conn.ReadMessage()if err != nil {log.Println("读取错误:", err)break}var data struct {PID string `json:"pid"`Last float64 `json:"last_numeric"`ChgPct string `json:"pcp"`}if err := json.Unmarshal(message, &data); err != nil {continue}fmt.Printf("实时更新 PID-%s: %.2f (%s)\n", data.PID, data.Last, data.ChgPct)}
}
三、功能整合示例
func main() {// 获取印度市场数据(国家ID=14)GetStockList(14)// 获取指定股票的K线(15分钟间隔)GetKLineData(7310, "PT15M")// 启动WebSocket连接go ConnectWebSocket()// 保持主线程运行select {}
}
四、关键注意事项
-
参数处理
- 国家ID对照:印度(14)、中国(42)、美国(840)等
- 时间间隔格式:PT15M(15分钟)、P1D(日线)
-
错误处理
if resp.StatusCode() != 200 {fmt.Printf("请求失败,状态码:%d\n", resp.StatusCode())return
}
- 性能优化
- 使用连接池复用HTTP Client
- 对高频请求添加缓存机制
- WebSocket心跳保持(每30秒发送ping)
五、总结
通过本文的实现,我们可以:
✅ 获取全球多个国家的股票市场数据
✅ 查询详细K线图表信息
✅ 实时接收价格变动推送
✅ 对接IPO日历、公司信息等扩展功能
完整示例代码已上传GitHub(替换为你的仓库链接)。实际使用时请根据业务需求添加认证、日志记录和监控模块。
扩展建议:
- 添加Redis缓存高频数据
- 实现自动重连机制(WebSocket)
- 开发RESTful API包装原始接口
- 添加Prometheus监控指标