为什么选择Go语言
- 高并发能力强:goroutine 轻量级线程,单机可轻松支撑数十万 WebSocket 长连接。
- 低延迟:编译为原生机器码,无虚拟机开销,撮合引擎对延迟极其敏感。
- 内存安全:没有C/C++的内存泄漏隐患,同时保留了接近底层的性能。
- 部署简单:编译为单个二进制文件,方便容器化和集群部署。
交易所整体架构
一个典型的交易所系统包含以下模块:

┌─────────────┐
│ API 网关 │ ← REST API / WebSocket
├─────────────┤
│ 用户系统 │ ← 注册、登录、KYC、2FA
├─────────────┤
│ 资产系统 │ ← 充值、提现、账务冻结
├─────────────┤
│ 撮合引擎 │ ← 订单撮合(核心)
├─────────────┤
│ 行情服务 │ ← K线、深度、成交记录
├─────────────┤
│ 钱包服务 │ ← 对接区块链节点
└─────────────┘
技术选型建议:
| 组件 | 推荐方案 |
|---|---|
| Web框架 | Gin |
| 数据库 | MySQL(账务)+ Redis(缓存/深度) |
| 消息队列 | Kafka / NSQ |
| WebSocket | gorilla/websocket |
| 精度处理 | shopspring/decimal |
| 区块链交互 | go-ethereum、btcd |
⚠️ 注意:涉及资金的计算严禁使用 float64,必须使用 decimal 库避免精度丢失。
项目结构
exchange/
├── cmd/server/main.go # 入口
├── internal/
│ ├── api/ # REST接口
│ ├── ws/ # WebSocket服务
│ ├── engine/ # 撮合引擎
│ ├── model/ # 数据模型
│ ├── matcher/ # 订单处理
│ └── wallet/ # 钱包服务
├── configs/
└── go.mod
核心模块开发
1 订单模型定义
package model
import "github.com/shopspring/decimal"
type Side int
const (
SideBuy Side = iota
SideSell
)
type Order struct {
ID uint64 `json:"id"`
UID uint64 `json:"uid"`
Symbol string `json:"symbol"` // 交易对,如 BTC/USDT
Side Side `json:"side"`
Price decimal.Decimal `json:"price"`
Quantity decimal.Decimal `json:"quantity"`
Filled decimal.Decimal `json:"filled"` // 已成交数量
Timestamp int64 `json:"timestamp"`
}
type Trade struct {
TradeID uint64
Symbol string
Price decimal.Decimal
Quantity decimal.Decimal
MakerID uint64 // 挂单方
TakerID uint64 // 吃单方
Timestamp int64
}