我正在尝试将这个简单的 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
郎朗坤
TA贡献1921条经验 获得超9个赞
错误已经告诉你:价格是一个字符串。所以它可能来自一个看起来像这样的 JSON:
{
"price": "123"
}
但不是
{
"price": 123
}
第一个解组为字符串。第二个解组为 float64。
在您的情况下,您必须解析它:
pricer,err := strconv.ParseFloat(price.(string),64)
- 2 回答
- 0 关注
- 117 浏览
添加回答
举报
0/150
提交
取消