ctrl
ctrl

Reputation: 15

Go openweathermap forecast return type

I am new to go and I am trying to build a little weather app using OpenWeatherMap and the go-package by briandowns.

I have no problem with reading the current weather but I have trouble processing the results of the forecast methods.

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)
}

where the apiKey needs to be replaced by a valid one (which one can get for free upon registration).

My problem is to extract the information from the ForecastWeatherJson. It is defined as:

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

in the forecast.go file.

With Decode defined as:

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

in forecast5.go.

I really do not know where to start as I did not find a documented example which showed processing the data except for other languages (so I guess it s a go specific problem). I saw how it can be done in e.g. python but in the go case the return type is not clear to me.

Any hints or links to examples are appreciated.

Upvotes: 0

Views: 144

Answers (1)

ttomalak
ttomalak

Reputation: 2036

Data that you need are already decoded in you w param, but you need to type assert to correct Weather type. In your case because you are using type=5 you should use owm.Forecast5WeatherData. Then your main will look like this.

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)
    }
}

Upvotes: 1

Related Questions