为了账号安全,请及时绑定邮箱和手机立即绑定

恐慌:接口转换:接口 {} 是字符串,而不是 float64

恐慌:接口转换:接口 {} 是字符串,而不是 float64

Go
神不在的星期二 2022-10-24 15:18:33
我正在尝试将这个简单的 python 函数转换为 golang,但是遇到了这个错误的问题panic: interface conversion: interface {} is string, not float64pythondef binance(crypto: str, currency: str):    import requests    base_url = "https://www.binance.com/api/v3/avgPrice?symbol={}{}"    base_url = base_url.format(crypto, currency)      try:        result = requests.get(base_url).json()        print(result)        result = result.get("price")    except Exception as e:                return False    return result这是 golang 版本(比应该的更长的代码和更复杂的代码)func Binance(crypto string, currency string) (float64, error) {    req, err := http.NewRequest("GET", fmt.Sprintf("https://www.binance.com/api/v3/avgPrice?symbol=%s%s", crypto, currency), nil)    if err != nil {         fmt.Println("Error is req: ", err)    }        client := &http.Client{}        resp, err := client.Do(req)    if err != nil {        fmt.Println("error in send req: ", err)    }    respBody, _ := ioutil.ReadAll(resp.Body)    var respMap map[string]interface{}    log.Printf("body=%v",respBody)    json.Unmarshal(respBody,&respMap)     log.Printf("response=%v",respMap)    price := respMap["price"]    log.Printf("price=%v",price)    pricer := price.(float64)    return pricer, err}那么我在这里做错了什么?以前我有错误cannot use price (type interface {}) as type float64 in return argument: need type assertion,现在我尝试了类型断言,pricer := price.(float64)现在这个错误panic: interface conversion: interface {} is string, not float64
查看完整描述

2 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

它在错误中告诉你,price是一个字符串,而不是 float64,所以你需要做(大概):


pricer := price.(string)

return strconv.ParseFloat(pricer, 64)

更好的方法可能是改为


type response struct {

    Price float64 `json:",string"`

}

r := &response{}

respBody, _ := ioutil.ReadAll(resp.Body)

err := json.Unmarshal(respBody, r) 

return r.Price, err

“字符串”选项表示字段在 JSON 编码的字符串中存储为 JSON。它仅适用于字符串、浮点、整数或布尔类型的字段。


https://pkg.go.dev/encoding/json#Marshal


查看完整回答
反对 回复 2022-10-24
?
郎朗坤

TA贡献1921条经验 获得超9个赞

错误已经告诉你:价格是一个字符串。所以它可能来自一个看起来像这样的 JSON:


{

   "price": "123"

}

但不是


{

   "price": 123

}

第一个解组为字符串。第二个解组为 float64。


在您的情况下,您必须解析它:


    pricer,err := strconv.ParseFloat(price.(string),64)


查看完整回答
反对 回复 2022-10-24
  • 2 回答
  • 0 关注
  • 117 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信