Build Pong in Your Terminal with Go for Some Reason
earthly.dev
earthly.dev
I am coming off of a couple of years of playing with C to understand languages better, and free myself from the complex stacks that I use at work. I've been chatting with a highly-educated PL friend of mine about my language likes/dislikes, and he would always remark on really pragmatic choices Go had made.
I had always dismissed Go, and that has really let me see a reddit/HN hivemind I'm susceptible to. It was so easy to think "GC? Google? No thanks". After a while I saw a pattern of people disparaging Go in favor of Rust, but then using Python/JS for their own actual code. It made me feel that maybe the hivemind had overlooked the actual use-cases.
I understand that the language had its problems, from sub-par GC performance to poor Windows support, to the "no generics" meme. But for someone just getting into it now, it has been SEAMLESS. VSCode is a first-class dev environment after being configured by the single official Go plugin. Modules are awesome, and coming from C its so nice to just "go build" and have that just work.
I really expect Go to pick up a lot of steam with hobby developers soon. For simple games, Go is capable of producing cross-compiled static Windows binaries with SDL2 from Linux. That kind of dev experience could really win over a lot of C++ holdouts from the itch.io and HandMade communities that would prefer if C++ was just C with classes and types. The GC is so fast that it doesn't even cut into a 60fps time budget, and all the preallocation tricks from C still work fine... it has pointers and arrays like we are used to.
I was shocked to find how much I'd enjoyed Go. If you are interested in C/Zig/Odin, I think it is certainly worth checking out Go as a tool to play with arrays and structs, a paradigm many programmers enjoy. Having high quality libraries in the stdlib like JSON (de)serializers and even animated GIF authoring means that a lot of the simple code you might write for your own amusement won't be subject to the fast bitrot of other ecosystems.
NPM (packages) frequently go down, doesn't resolve packages, or just does something unexpected. Java has the Gradle/Maven split, C++ has a few extra common ones - Make/CMake, Autotools, Ninja, Meson, etc. Modern C# is the one that's got a similar scene to Go from what I've seen.
Go is simple and consistent. It adheres to the Zen of Python, particularly "There should be one– and preferably only one –obvious way to do it.", better than Python itself does (IMO). You check out a repo, you run go build, and 90% of the time you have a binary. A 5 line Python script could automate this process, good luck doing the same with Java or C++.
I'm not saying Go is the only modern language, its pretty retro in some ways, but it has an exceptional tooling story. The fact that its mainly based around the official go tool helps.
The tooling is probably why Go and Rust get compared so often, despite having little in common. Its weird to see that written off as a common feature though. It was nothing like my experience with clojure or julia.
If there are any languages with Go-like tooling that have a bigger job market, I'd love to know.
Are you using a small or large code base? VSCode falls over at my job's monorepo. Goland has much better performance.
I ended up writing a Go -> C++ compiler. Go's standard library parser/typechecker made it very doable. The games I've done with it don't use the GC at all but also don't manually manage memory -- they use an ECS api which helps. https://github.com/nikki93/gx -- the README links to development workflow video and complete example game code. I get the perf, interop/libs and portability of C/C++ but with Go's developer experience (well the build system involves C/C++ of course but I have something set up there that I now just use).
However there is an absurd amount of nil checking which can be easy to miss and not always caught by the common linting tools. Once you use Result/Option types and proper enums with pattern matching that is expressive and safe, it wears on you that Go does not have this.
And it's a completely unforced error and doubled-down on by the development team.
1) Simplify error handling. It's annoying having to create your own stack frame by composing strings.
2) Let me use my variable names. I find it so annoying that I have to come up with names just because the variable is being shadowed. Either change the package scope to use :: or make types be PascalCase with an `pub` keyword for exports.
3) Add a shorthand for lambda instead of having to type `func()`.
4) Allow a file scoped, not package, variable.
I love Go and use it daily, but I wish we had anything similar to VB, even if it's just a helper UI builder. Being able to shape, position, and name objects visually, then modify attributes in code, is (to me) so much easier than doing it strictly in code. Does any such GUI builder exist? I don't necessarily want VB or a similar IDE, just a way to design using a GUI and program behind it.
I can't stand scripting a GUI. If I'm gonna have a GUI I want to draw it and know what it's going to look like instead of getting surprises when I run it. Whoever does Visual Python will make a lot of money.
I think videogames are a great way to showcase channels in Go.
And playing with funky patterns using braille characters: https://github.com/onnos/rotaterm
It's not great quality code but it got me started! It's nice to have some immediate output you can play with - tcell is lovely.
Well now we have a program that says “Hi!” until you press escape. For the loneliest among us, that may be enough. But we came here to build a game, so we’ll need some kind of animation.
Love the humorLooking forward to part 2!
func main() {
screen, err := tcell.NewScreen()
if err != nil {
log.Fatalf("%+v", err)
}
if err := s.Init(); err != nil {
log.Fatalf("%+v", err)
}
}I recently used Bubble Tea to write a Flappy Bird-like game [2] and it was incredibly fun. It splits your app up into a Model (state), a View function (that uses the model to return a string), and an Update function (that updates the model), like Elm. Plus the other Charm libraries are great for styling terminal output, spring physics, etc.
[1] https://github.com/charmbracelet/bubbletea [2] https://github.com/kbrgl/flapioca
Nice work!
Note that this was submitted by the author, who's in the thread.
Or maybe I'm just bad at internet searches!