使用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 main
import (
"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 MarketResponse
if 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 []KLine
if 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监控指标