рдЧреЛрд▓рдВрдЧ рдФрд░ рдлреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдбреЗрд╕реНрдХрдЯреЙрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдирд╛

рдЖрдЬ рд╣рдо рдЧреЛрд▓рдВрдЧ рдкрд░ рдПрдХ рдбреЗрд╕реНрдХрдЯреЙрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВрдЧреЗ


рдПрдХ рдЧреЛрд▓реИрдВрдЧ рдбреЗрд╕реНрдХрдЯреЙрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдПрдХ рдЧреЛрд▓реИрдВрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИред Google рдХреЗ рд▓рд┐рдП рдЗрддрдиреЗ рд╕рд╛рд░реЗ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдУрдкрди рд╕реЛрд░реНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рдЧреЛрд▓рдЧрдкреНрдкреЗ рдбреЗрд╕реНрдХрдЯреЙрдк рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рдП рдЧрдП рд╣реИрдВ, рдЗрд╕рдХреЗ рдЙрджрд╛рд╣рд░рдг:

  1. gotk
  2. Fyne
  3. Gxui

Fyne рдХреЛ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЧрд┐рддреБрдм рднрдВрдбрд╛рд░ рдореЗрдВ рд╕рд┐рддрд╛рд░реЛрдВ рдХреА рд╕рдмрд╕реЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╕рд╛рдордЧреНрд░реА рдбрд┐рдЬрд╛рдЗрди рдХрд╛ рднреА рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХреНрдпрд╛ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдЬреЗрдЯ рдмреЙрдХреНрд╕ рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ:

  • рдмрдЯрдиред
  • рдПрдХ рдХрдВрдЯреЗрдирд░ (рдмрдЪреНрдЪреЗ рдХреЗ рд╡рд┐рдЧреЗрдЯреНрд╕ рдХреЛ рд╕рдореВрд╣реАрдХреГрдд рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреНрд╖реИрддрд┐рдЬ рдпрд╛ рд▓рдВрдмрд╡рдд рд░реВрдк рд╕реЗ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред
  • рдЪреЗрдХрдмреЙрдХреНрд╕, рдкрд╛рда рдпрд╛ рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдбред
  • рдлрд╛рд░реНрдо рдФрд░ рд╕рдореВрд╣ред
  • рд╣рд╛рдЗрдкрд░рд▓рд┐рдВрдХред
  • рдореВрд░реНрддрд┐ред
  • рдкрд░реНрдЪреАред
  • рдкреНрд░рдЧрддрд┐ рдкрдЯреНрдЯреАред
  • рдПрдХ рд╕реНрдХреНрд░реЙрд▓ рдХрдВрдЯреЗрдирд░ред
  • рд╕реНрд╡рд┐рдЪред
  • рдЪреБрдирддреЗ рд╣реИрдВ
  • рдЯреИрдмреНрд╕ред
  • рдЯреВрд▓рдмрд╛рд░ред

рдЗрд╕ рдШрдЯрдирд╛ рдореЗрдВ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрддреНрд╡реЛрдВ рдХреЗ рдмреАрдЪ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╕рд░рд▓ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╕реНрдЯрдо рд╡рд┐рдЬреЗрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред

рдЖрдЗрдП рдЕрдЧрд▓реЗ рдХреБрдЫ рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП Fyne рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдореМрд╕рдо рдХреЗ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреЛрд▓рдЧрдкреНрдкреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдХрд░реЗрдВред рдкреВрд░рд╛ рдЖрд╡реЗрджрди рдХреЛрдб рдЬреАрдердм рдкрд░ рд▓рд┐рдВрдХ рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЧреЛрд▓рдВрдЧ рдкрд░ рдПрдХ рдЦрд╛рд▓реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдФрд░ Fyne рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВред

go get fyne.io/fyne

рдЪреВрдВрдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореМрд╕рдо рдХреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдУрдкрди рд╡реЗрджрд░ рдореИрдк рдПрдкреАрдЖрдИ рдХреА рдУрд░ рдореБрдбрд╝реЗрдВред

func getWeatherForecast(result interface{}) error {
  var url = fmt.Sprintf("https://api.openweathermap.org/data/2.5/forecast?q=Voronezh&cnt=4&units=metric&appid=%s", openWeatherMapApiKey) //    
  response, err := http.Get(url)
  if err != nil {
     fmt.Print(err)
  }
  defer response.Body.Close()
  return json.NewDecoder(response.Body).Decode(result)
}

рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рдореНрди рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЗрд╕рдореЗрдВ рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдХреБрдЫ рдлрд╝реАрд▓реНрдб рдЫреЛрдбрд╝ рджрд┐рдП рд╣реИрдВ рдЬреЛ рдПрдкреАрдЖрдИ рд▓реМрдЯрддреЗ рд╣реИрдВ), рдпрд╣ рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдкреВрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдкреАрдЖрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

type WeatherInfo struct {
  List []WeatherListItem `json:list`
}

type WeatherListItem struct {
  Dt      int           `json:dt`
  Main    WeatherMain   `json:main`
  Weather []WeatherType `json:weather`
}

type WeatherMain struct {
  Temp      float32 `json:temp`
  FeelsLike float32 `json:feels_like`
  Humidity  int     `json:humidity`
}

type WeatherType struct {
  Icon string `json:icon`
}

рдЕрдм рд╣рдо рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдореМрд╕рдо рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ golang рдбреЗрд╕реНрдХрдЯреЙрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред

func setupUi(weatherInfo WeatherInfo) {
  app := app.New()

  w := app.NewWindow("   ")

  var vBox = widget.NewVBox() //        

  for i := 0; i < len(weatherInfo.List); i++ {
     var weatherForDay = weatherInfo.List[i] //     
     var weatherMainGroup = widget.NewVBox(
        widget.NewLabel(fmt.Sprintf(": %.2f ┬░C", weatherForDay.Main.Temp)),
        widget.NewLabel(fmt.Sprintf(" : %.2f ┬░C", weatherForDay.Main.FeelsLike)),
        widget.NewLabel(fmt.Sprintf(": %d%%", weatherForDay.Main.Humidity)),
     ) //  3    

     var weatherTypeGroup = widget.NewVBox()
     for weatherTypeI := 0; weatherTypeI < len(weatherForDay.Weather); weatherTypeI++ {
        var resource, _ = fyne.LoadResourceFromURLString(fmt.Sprintf("http://openweathermap.org/img/wn/%s.png", weatherForDay.Weather[weatherTypeI].Icon)) //   ,   
        var icon = widget.NewIcon(resource)
        weatherTypeGroup.Append(icon)
     }

     var time = time2.Unix(int64(weatherInfo.List[i].Dt), 0).String()
     vBox.Append(widget.NewGroup(time)) 
     vBox.Append(widget.NewHBox(weatherMainGroup, weatherTypeGroup))
  }
  vBox.Append(widget.NewButton("", func() {
     app.Quit()
  }))

  w.SetContent(vBox) //    

  w.ShowAndRun() //   
}

рдпрд╣рд╛рдВ рд╣рдо рдЕрдкрдиреЗ рд╡рд┐рдЬреЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдбреЗрдЯрд╛ рд╕реЗ рднрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╡реЗ рдЙрд╕ рдХреНрд░рдо рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рд╕рдХреЗрдВ рдЬрд┐рд╕рдореЗрдВ рд╡реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред

рдХрд┐рдпрд╛ рд╣реБрдЖред

рдпрд╣ рдХреЗрд╡рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЪрд▓рд╛рдиреЗ рдФрд░ рдпрд╣ рдХреИрд╕реЗ рджрд┐рдЦрддрд╛ рд╣реИ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдЪреВрдВрдХрд┐ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╣реИ, рдЖрдк рдЗрд╕реЗ рд╡рд┐рдВрдбреЛрдЬ рдФрд░ рдореИрдХрдУрдПрд╕ рдФрд░ рд▓рд┐рдирдХреНрд╕ рджреЛрдиреЛрдВ рдкрд░ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЫрд╡рд┐
рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЧреЛрд▓рдВрдЧ рдореИрдХ рдУрдПрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди

рдЫрд╡рд┐
рдФрд░ рдпрд╣ рдПрдХ рдЧреЛрд▓рдЧрдкреНрдкрд╛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛

рд╣реИ рдирддреАрдЬрддрди, рдпрд╣ рдПрдХ рд╕рд░рд▓ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдЧреЛрд▓рдВрдЧ рдбреЗрд╕реНрдХрдЯреЙрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдХрд▓рд╛, рдФрд░ рдПрдХреНрд╢рди рдореЗрдВ рдлреЗрди рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЖрдзреБрдирд┐рдХ рдбреЗрд╕реНрдХрдЯреЙрдк рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХреБрдЫ рдирдпрд╛ рдФрд░ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╕реНрдкрд░реНрд╢ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрддрд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред

All Articles