Сегодня мы будем разрабатывать desktop приложение на Golang
Разработка golang desktop приложения — не совсем типичная задача для golang программиста. Готовых open source библиотек для ее решения гугл по запросу golang desktop выдает не так уж и много, примеры того, что удалось найти:
- gotk
- Fyne
- GXUI
Выбран был Fyne, так как github-репозиторий этого проекта содержит наибольшее количество звездочек, а также он поддерживает небезызвестный Material design.
Посмотрим, какие возможности для отображения интерфейса он нам предоставляет.
Из коробки доступны следующие виджеты:
- Кнопка.
- Контейнер (для группировки дочерних виджетов и направления их по горизонтали или вертикали).
- Чекбокс, поля для ввода текста или пароля.
- Формы и группы.
- Гиперссылка.
- Иконка.
- Лейбл.
- Прогресс бар.
- Контейнер с поддержкой скролла.
- Переключатель.
- Select.
- Табы.
- Тулбар.
В случае, если среди элементов интерфейса нужного не нашлось, есть возможность реализовывать кастомные виджеты с помощью простого API.
Попробуем написать golang gui приложение для отображение прогноза погоды на ближайшие несколько дней с помощью Fyne. С полным кодом приложения можно ознакомиться по ссылке на github.
Первым делом, создадим пустой проект на Golang и установим Fyne.
go get fyne.io/fyne
Так как приложение будет отображать информацию о погоде, необходимо эту информацию получить. Для этого обратимся к Open Weather Map API.
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)
}
Для хранения данных можно использовать следующую структуру (в ней я оставил лишь некоторые из полей, которые возвращает API), стоит обратить внимание на то, что все поля структуры объявлены с большой буквы, но в ответе API они описаны с маленькой.
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 desktop приложения.
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() // запускаем сконфигурированное приложение
}
Здесь мы создаем наши виджеты, заполняем их данными и собираем их в группы для организации порядка их отображения.
Готово.
Остается только запустить приложение и посмотреть как оно выглядит. Так как фреймворк кроссплатформенный, можно запустить его, как на Windows, так и на macOS и Linux.

Запущенное golang mac os приложение

А так выглядит golang windows приложение
В результате, получилось создать простое кроссплатформенное golang desktop приложение, и попробовать в действии Fyne. К сожалению, вряд ли стоит рассматривать go, как подходящий язык для разработки современных desktop приложений, однако, всегда интересно прикоснуться к чему-то новому и необычному на практике.
Всем спасибо за внимание.