GoForms
GUI-фреймворк для Go, повторяющий System.Windows.Forms:
контролы по X, Y, Width, Height, docking и anchoring,
многоадресные события с сигнатурой (sender, e) и форма,
разделённая на сгенерированную половину и написанную руками.
Отрисовка, окна и ввод — от Fyne, поэтому рисуется через GPU на Windows, Linux и macOS и собирается ещё под WebAssembly и Android. Всё, что выше этой границы — каталог контролов, правила раскладки, модель событий — это API WinForms, с именами тех типов, которые он заменяет.
Дизайнер — расширение для VS Code. Он читает и пишет тот же Go-файл, который вы
написали бы руками: никакого .resx, никаких ресурсных
блобов, ничего, что открывается только инструментом.
Форма — это два файла
Ровно то разделение, которое WinForms делает между
Form1.Designer.cs и Form1.cs.
Дизайнер пишет только первый файл; второй ваш, и он не переписывается.
type MainForm struct { *goforms.Form btnGreet *goforms.Button lblHello *goforms.Label } func (mf *MainForm) initializeComponent() { mf.lblHello = goforms.NewLabel("Hello, World!") mf.lblHello.SetBounds(20, 20, 200, 24) mf.AddControl(mf.lblHello) mf.btnGreet = goforms.NewButton("Greet") mf.btnGreet.SetBounds(20, 60, 100, 30) mf.btnGreet.Click.Handle(mf.btnGreet_Click) mf.AddControl(mf.btnGreet) }
package mainform import goforms "github.com/Go-Forms/GoForms" // Дизайнер написал это, когда вы привязали Click, // и больше сюда не возвращается. func (mf *MainForm) btnGreet_Click( sender any, e goforms.MouseEventArgs, ) { mf.lblHello.SetText("Clicked!") }
Что перенесено из WinForms
- Абсолютные координаты.
SetBounds(x, y, w, h)ставит контрол туда, куда сказано, считая от размера, под который форма нарисована. - Docking и anchoring. Те же пять стилей закрепления и четыре флага привязки, применяемые в том же порядке: закреплённые дети режут клиентскую область, а остаток становится рамкой, относительно которой считаются привязки.
- Многоадресные события.
Event[T]ведёт себя как событие в C#:Handle(h)— это+=, обработчики выполняются в порядке добавления, сигнатура всегда(sender any, e T). - Диалоги.
ShowDialogвозвращаетDialogResult; message box, выбор файла, папки и цвета отвечают через колбэк — тулкит рисует их на UI-горутине, и блокировка была бы взаимной. - Контейнеры. Panel, GroupBox, TabControl, SplitContainer, FlowLayoutPanel, TableLayoutPanel — каждый раскладывает детей так же, как его двойник в WinForms.
- Темы. Один литерал
Themeзадаёт вид всего приложения; незаполненное поле оставляет умолчание тулкита, а не превращается в пустоту.
Геометрия закреплённых и табличных раскладок закреплена golden-тестами: правка, которая сдвинет контрол на пиксель, роняет сборку, а не уезжает в релиз.
Дизайнер
Открытый в VS Code файл *-designer.go превращается в канву.
Перетаскивание контрола пишет вызов конструктора, его сеттеры и поле структуры;
перемещение переписывает границы; переименование меняет имя поля и все ссылки на него.
Привязка события создаёт типизированную заготовку обработчика в рукописном файле,
добавляет нужный импорт и переписывает существующую привязку, а не кладёт вторую рядом.
Каждая правка заканчивается уборкой: удаляются сеттеры, которые перекрыты более поздним вызовом, повторные добавления, дублирующиеся поля. Файл записывается в форме gofmt, поэтому правка из дизайнера и правка руками дают один и тот же результат. Закреплённые контролы рисуются там, где они окажутся на самом деле, а не по сохранённым координатам.
Он же создаёт проекты (пустой, пример, под браузер, под Android), открывает тему проекта как визуальный редактор и собирает и запускает проект под десктоп, браузер или подключённый телефон.
Каталог контролов
Все типы ниже есть в тулбоксе дизайнера и понятны генератору кода.
Основные контролы
Контейнеры
Меню и панели
Данные
DataGridView с сортируемыми и растягиваемыми колонками, рядом TreeView.Установка
Go 1.23 или новее плюс C-тулчейн и заголовки OpenGL, которые нужны Fyne на вашей
платформе. На Debian или Ubuntu это
gcc pkg-config libgl1-mesa-dev xorg-dev libxkbcommon-dev libwayland-dev.
Windows, Linux и macOS поддерживаются одинаково и проверяются на каждом коммите.
go get github.com/Go-Forms/GoForms # Либо запустить showcase — это все контролы # и раскладки в одном приложении: git clone git@github.com:Go-Forms/GoFormsShowcase.git cd GoFormsShowcase && go run .
# Из последнего релиза: code --install-extension goforms-designer-0.10.2.vsix # Дальше в VS Code: # Ctrl+Shift+P -> "GoForms: Create New Project..." # Откройте любой *-designer.go, чтобы получить канву.
Репозитории
- GoForms — сам фреймворк: контролы, раскладка, события, диалоги, темы.
- GoFormsDesigner — расширение для VS Code и Go-инструмент, который разбирает и переписывает designer-файлы.
- GoFormsShowcase — по одной форме на тему, с живым журналом событий: всё, что написано на этой странице, можно проверить запуском.
- GoFormsDemo — пример поменьше, ближе к первым формам настоящего проекта.