Can you do game development with Go?
I’ve been experimenting with Go for game development over the past few days, and honestly, I had the same skepticism you probably have right now. Go is a garbage-collected language—how could it possibly be good for game dev? And does Go even have decent game engines?
Turns out, yes, you can make games with Go. But there are some real caveats you need to know about.
Know What You’re Getting Into
If you want to ship a production-ready game to PS5/Xbox/Steam with realistic 3D graphics, just stop here and use Unity, Unreal, or maybe even Godot. Go isn’t the tool for that job.
The game dev ecosystem for Go is small. Only a handful of engines exist, though there are bindings for libraries like Raylib and SDL3. I’ve personally been using Ebiten, which focuses on 2D games. It has most of the features you’d need for 2D development, and the biggest win is how easy deployment is. If you use bindings like Raylib or SDL3 and try to deploy to web, the experience just isn’t smooth.
The Two Big Problems (And How to Deal With Them)
When making games in Go, you’re dealing with two potential issues:
1. Garbage Collection
Yeah, Go has a garbage collector. But here’s the thing—in my tests, garbage collection took around 0.05ms for 50,000 sprites. You have about 16ms per frame to hit 60fps, so GC barely makes a dent. The trick is not allocating tons of memory inside your game loop. If you’re careful about that, you’re fine.
2. CGO Overhead
Libraries like Raylib and SDL3 use CGO, which adds overhead. A single CGO call takes just a few nanoseconds, but if you’re making tens of thousands of calls per frame (like rendering each sprite individually), you’ll kill your performance. The solution is batching—group operations to reduce the number of CGO calls per frame.
Ebiten sidesteps this entirely because it’s pure Go. No CGO means you can compile binaries for web, desktop, and mobile without jumping through hoops. Ebiten even provides an ebitenmobile command to handle mobile builds. With CGO-based libraries like Raylib or SDL3, you’re stuck trying to merge separately-compiled WASM binaries or wrestling with C/Go interop on mobile—it’s just messy.
Scaling Up: ECS and Performance
As your game gets more complex, you’ll probably want an Entity Component System (ECS). Ebiten doesn’t include one, but I found Ark that works great. It’s easy to pick up, and in my tests, I didn’t see any performance drop. Ark claims to be high-performance, and from what I’ve seen, that checks out.
One more nice thing: my Wasm binary with Ebiten, after brotli compression, came in under 4MB. That’s solid for web deployment.
I Ran Some Benchmarks
I built some benchmark applications to test if Go was even viable for game dev. I compared Ebiten, Raylib, and SDL3 in Go, with and without Ark ECS. I also threw in comparisons against Raylib in C and Bevy with Rust. These are synthetic benchmarks (not real games), so take the numbers with a grain of salt—but they helped me decide Go was worth pursuing.
Here is the link to repo. I have posted my results there.
So Should You Use Go for Game Dev?
Here’s my take: Ebiten + Ark is a strong choice for 2D games. The developer experience is good, deployment is easy, and performance is solid if you’re mindful about allocation and batching.
But if you need 3D, your options aren’t mature yet. Also, Ebiten uses OpenGL under the hood, which is fine for 2D but won’t help if you want Vulkan or DirectX 12.
For hobby projects, game jams, or 2D indie games? Go is legitimately worth considering. For AAA 3D? Stick with the established tools.