含Interface的Struct取值处理?Binance深度接口解析报错解决
解决Binance深度接口解析后乘法运算报错的问题
我太懂你这个困扰了——自动生成的结构体把Asks和Bids的元素都定义成了interface{},导致连基础的乘法运算都做不了,确实挺闹心的。咱们来一步步解决这个问题:
为什么会出现这个错误?
Binance的深度接口返回的bids和asks是嵌套JSON数组,每个子数组里是两个字符串格式的数字(价格和数量)。大多数自动生成结构体的工具没法从数组里推断出具体的数值类型,所以会默认用interface{}这种通用类型来兼容。而Go里是不能直接对interface{}类型做算术运算的,这就是报错的根源。
方案1:用明确类型的嵌套切片(最简单)
其实不需要单独给bids/asks创建复杂的结构体,只要把它们定义成**float64类型的切片的切片**就行:
// 深度书结构体定义 type DepthBook struct { LastUpdateId int64 `json:"lastUpdateId"` Bids [][]float64 `json:"bids"` Asks [][]float64 `json:"asks"` }
当你把JSON数据解析到这个结构体里时,Go的JSON解析器会自动把Binance返回的字符串格式数字转换成float64类型。这时候再执行book.Asks[i][0] * book.Asks[i][1]就完全没问题了。
方案2:用结构体封装单个挂单(可读性更高)
如果想要代码更清晰、更易维护,可以给每个挂单独自定义一个结构体,再用切片来包含这些结构体:
// 单个挂单的结构体 type OrderBookEntry struct { Price float64 `json:"0"` // 对应数组的第一个元素(价格) Amount float64 `json:"1"` // 对应数组的第二个元素(数量) } // 深度书结构体 type DepthBook struct { LastUpdateId int64 `json:"lastUpdateId"` Bids []OrderBookEntry `json:"bids"` Asks []OrderBookEntry `json:"asks"` }
这种情况下,乘法运算的代码会更直观:
totalValue := book.Asks[i].Price * book.Asks[i].Amount
再也不用纠结数组索引哪个是价格、哪个是数量了,代码可读性提升不少。
快速验证类型是否正确
解析完成后,你可以打印一下类型来确认转换是否成功:
// 方案1的验证方式 fmt.Printf("Ask价格的类型:%T,值:%v\n", book.Asks[0][0], book.Asks[0][0]) // 方案2的验证方式 // fmt.Printf("Ask价格的类型:%T,值:%v\n", book.Asks[0].Price, book.Asks[0].Price)
如果输出显示类型是float64,就说明一切正常啦。
内容的提问来源于stack exchange,提问作者Enrique Alcazar
相关产品推荐
相关产品推荐

