Frontend Labs
⋯

Part V — Real-world builds: GUI

Same capstone spirit as Part IV, aimed at the desktop instead of the terminal. Go has no built-in GUI toolkit — a deliberate omission — so this part is as much about evaluating the ecosystem (Fyne, Gio, Wails, Walk) as it is about building with one; the two projects that follow use different approaches (native Fyne, web-based Wails) so you can feel the trade-off directly instead of taking it on faith.

43. GUI options in Go: Fyne, Gio, Wails, Walk, and "just serve HTML"

Go has no built-in GUI toolkit — this is a deliberate omission consistent with the language's "small core, do one thing well" philosophy — but a mature ecosystem fills the gap, with genuinely different trade-offs:

Toolkit Model Best for
Fyne Pure Go, custom-drawn widgets, cross-platform (desktop + mobile) Native-feeling cross-platform desktop apps, single binary
Gio Pure Go, immediate-mode rendering, GPU-accelerated Highly custom UI, animations, mobile + desktop from one codebase
Wails Go backend + a real web frontend (HTML/CSS/JS/React/Vue) in a native window Teams that already know web frontend and want Electron-like DX without Electron's footprint
Walk Thin wrapper over native Win32 widgets Windows-only apps that should feel native on Windows
"Serve HTML" net/http + html/template, opened in the user's normal browser Zero-install internal tools, dashboards, anything where "it's a webpage" is fine

43.1 The trade-off that decides most of these choices

Fyne and Gio give you one Go codebase and no embedded browser — often smaller distributables, though GUI builds may still depend on platform libraries. You're drawing your own widgets (Fyne looks clean and "good enough"; pixel-perfect custom design leans toward Gio). Wails gives you the full power of modern CSS/JS and any frontend framework you already know, at the cost of shipping a WebView-based window (lighter than Electron, since it reuses the OS's built-in WebView instead of bundling Chromium, but still a browser engine under the hood).

43.2 Real-world example

An internal engineering tool that just needs a form, a table, and a button to trigger a Go backend job is almost always fastest and easiest to maintain as "serve HTML on localhost, open it in the browser" — no GUI toolkit dependency at all. Reach for Fyne/Wails specifically when you need a real desktop app: a system tray icon, native file dialogs, an app users double-click from their Applications folder, or offline use with no browser required.


Generated from real-life-golang-guide.md · 8 Oct 2026 16:36