Как уже отмечали другие, утверждения типа будут решением для вашей немедленной ошибки, учитывая, что интерфейс содержит правильный тип структуры.
Но если ваш интерфейс получен из анализа JSON, он, скорее всего, будет содержать map[string]interface{}
, а не OrderBookResult
. См. здесь , почему это так.
Чтобы решить эту проблему, пожалуйста, прочитайте о том, как создать собственный маршаллер JSON. Например, в этом блоге. Ниже я также включил способ обработки map[string]interface{}
для получения ваших данных в функции публикации.
Таким образом, вы можете ввести assert перед вызовом:
....
case "data":
// Assert that e.Data is in fact a struct of type OrderBookResult
if dataAsOrderBookResult, ok := e.Data.(OrderBookResult); ok {
publish(dataAsOrderBookResult)
} else {
// handle error etc
...
}
....
Или измените подпись вашей функции публикации и введите assert параметр внутри:
func publish(data interface{}) {
log.Println("Publishing trade data...", data)
o := &OrderBook{}
// Type switch
switch v := data.(type) {
case OrderBookResult:
o.Pair = "BTCEUR"
o.Timestamp = v.Timestamp
o.Broker = "Bitstamp"
o.Asks = v.Asks
o.Bids = v.Bids
case map[string]interface{}:
o.Pair = "BTCEUR"
o.Timestamp = v["Timestamp"].(string)
o.Broker = "Bitstamp"
// here again you need to type assert correctly and it may be a map again
//o.Asks = v["Asks"].(OrderBookItem)
//o.Bids = v["Bids"].(OrderBookItem)
default:
// error handling etc.
...
}
...
}