首页 > 解决方案 > 去 openweathermap 预测返回类型

问题描述

我是新手,我正在尝试使用 OpenWeatherMap 和 briandowns 的 go-package 构建一个小天气应用程序。

我阅读当前天气没有问题,但我无法处理预测方法的结果。

func main() {
    apiKey := "XXXX"
    w, err := owm.NewForecast("5", "C", "en", apiKey)
    if err != nil {
        log.Fatal(err)
    }
    w.DailyByName("London", 1)

    data := w.ForecastWeatherJson
    fmt.Println(data)
}

其中 apiKey 需要替换为有效的(注册时可以免费获得)。

我的问题是从 ForecastWeatherJson 中提取信息。它被定义为:

type ForecastWeatherJson interface {
    Decode(r io.Reader) error
}

在 forecast.go 文件中。

解码定义为:

func (f *Forecast5WeatherData) Decode(r io.Reader) error {
    if err := json.NewDecoder(r).Decode(&f); err != nil {
        return err
    }
    return nil
}

在 forecast5.go 中。

我真的不知道从哪里开始,因为我没有找到显示处理数据的文档示例,除了其他语言(所以我猜这是一个特定的问题)。我看到了它是如何在例如 python 中完成的,但是在 go 的情况下,返回类型对我来说并不清楚。

任何提示或示例链接表示赞赏。

标签: jsongoopenweathermap

解决方案


您需要的数据已经在您的w参数中解码,但您需要键入 assert 以更正 Weather 类型。在你的情况下,因为你正在使用type=5你应该使用owm.Forecast5WeatherData. 然后你的主要看起来像这样。

func main() {
    apiKey := "XXXX"
    w, err := owm.NewForecast("5", "C", "en", apiKey)
    if err != nil {
        log.Fatal(err)
    }
    w.DailyByName("London", 3)

    if val, ok := w.ForecastWeatherJson.(*owm.Forecast5WeatherData); ok {

        fmt.Println(val)
        fmt.Println(val.City)
        fmt.Println(val.Cnt)
    }
}

推荐阅读