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.