pánico: conversión de interfaz: interface {} es string, no float64
Estoy tratando de convertir esta simple función de Python a Golang, pero estoy enfrentando problemas con este error.
def 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
Aquí está la versión en Golang (código más largo y más complicado de lo que debería):
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 en req:", err)
}
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Println("error en enviar 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, ok := price.(float64)
if !ok {
panic("Conversión de interfaz: interfaz {} es string, no float64")
}
return pricer, err
}
Entonces, ¿en qué me estoy equivocando aquí? Anteriormente, tenía el error cannot use price (type interface {}) as type float64 in return argument: need type assertion
y ahora intenté la aserción de tipo con pricer := price.(float64)
y ahora obtengo este error:
panic: interface conversion: interface {} is string, not float64
davy.ai
El problema aquí es que el valor
price
devuelto desde la llamada a la API no siempre es de tipofloat64
. También puede ser de tipostring
en algunos casos. Por lo tanto, cuando intentas afirmarlo a tipofloat64
usandopricer := price.(float64)
, resulta en un error si el tipo real esstring
.Para solucionar esto, puedes usar una sentencia de tipo
switch
para manejar ambos casos:En este código, primero utilizamos una sentencia de tipo
switch
para determinar siprice
es de tipofloat64
ostring
. Si esfloat64
, podemos usarlo directamente. Si esstring
, utilizamosstrconv.ParseFloat
para convertirlo afloat64
. Si no es ninguno de estos tipos, devolvemos un error.