type SpotPrice struct {
ProductId string `db:"product_id"` //产品id
High float64 `db:"high"` //最高价
Low float64 `db:"low"` //最低价
RenewDate string `db:"renew_date"` //更新时间
}
.
.
.
var pricei interface{}
var err error
pricei, err = db.GetSpotPrice(realPrice.ProductId,"","",1,1)
if err != nil {
logger.Warnning(err)
continue
}
value := pricei.([]price.SpotPrice)
realPrice.High = value[0].High
realPrice.Low = value[0].Low
realPrice.RenewDate = value[0].RenewDate
go的接口功能特别强大,空接口可以接受任何类型的变量,这不就有点类似c++的多态嘛,运行时确定,dynamic,哈哈哈
言归正传,pricei
是一个空接口,db.GetSpotHistoryPrice(conf.ProductId,"","",1,1)
返回的类型是[]SpotPrice
,动态传给了pricei
,value := pricei.([]price.SpotPrice)
这句是进行类型断言,是Go语言里面的一个语法特性。这时候value
就是一个真真正正的[]price.SpotPrice
引申一下,Comma-ok
断言:
value, ok = element.(T)
,这里value就是变量的值,ok是一个bool类型,element是interface变量,T是断言的类型。
拿到了value,我就可以做任何想做的事情了,比如上述代码接下来的取值赋值。
这样用的好处,就是可以代码复用,当我接收到一个函数返回的类型是多种的,不确定的,就可以这么写,然后进行类型断言,动态绑定数据。