From Go With Love • The Applied Go Weekly Newsletter 2025-02-23
Your weekly source of Go news, tips, and projects
From Go With Love
Hi ,
In the ever-evolving IT landscape… No, let me start over. AI is here to stay, and it already made an impact on jobs: Translators, writers, graphic designers, marketers, actors—they all see AI grab ever larger pieces of their cake. How about software development? I made a practical test. In this week's Spotlight, I share my observations from testing Goose, an AI agent for the desktop, on writing a Go project from scratch. And in the Unrelated to Go section, you can read more about AI versus software developers, and about the aspects and limits of using AI ethically.
However, regardless of how almighty AI may become, there is always one quality that sets us apart from AI models: Our passion for our work. We, not the AI, are the ones who can sign off our code with:
"Written in Go, with love."
–Christoph
Featured articles
How Protobuf Works—The Art of Data Encoding
Phuong Le dissects the Protobuf data format down to the least significant bit.
Building RAG systems in Go with Ent, Atlas, and pgvector | ent
Retrieval Augmented Generation (RAG) is when you stuff data into a vector database to have it handy during a chat with an LLM. Rotem Tamir built a RAG system to have some context when chatting with GPT-4o.
Map internals in Go 1.24
Since Go 1.24, maps are implemented as Swiss Tables, an efficient hashmap design. Mohamed Said explains how they work.
Podcasts and events
Release Notes v2025.2 - by Natalie from GopherCon Europe
Ticket sale for GopherCon Europe 2025 is open!
Cup o' Go: The strength of Go in the job market 📈, and some stress relief with Carlos Becker 🚀
If you have used Goreleaser, you (should) know Carlos Becker, the guest of this week's episode.
go podcast() 051: Event sourcing with Morgan Hallgren
Morgan Hallgren talks with Dominic St-Pierre about event sourcing and his library of the same name.
Spotlight: The art of delegating coding
This week, I tested Goose, an AI agent that uses the Model Context Protocol (MCP) to connect AI models with tools: read/write files, use your computer, search the web, read web pages, use Git, and so on.
I decided to have it write a project that I have on my list since quite a while but never got around to sit down and write it. It's basically a server that shall connect to Paddle (a merchant of record) to manage subscriptions.
Setting up Goose was easy: By default, it comes with enabled "developer mode", which allows Goose to read and write files. I only had to connect Goose to a model (via API) and give it a directory to work on.
Now, the first part of my project creation journey was without Goose. I generated a project plan by running Harper Reed's greenfield project generation steps with DeepSeek V3 (an instance hosted in the EU, BTW).
The greenfield steps include four LLM prompts:
- The first prompt advises the LLM to ask me questions about the project. After a while, the LLM concludes that it knows enough to write a spec, and so it did.
- The second step advises the LLM to write a comprehensive spec that a developer could use to start programming. (The spec the LLM wrote on its own in step 1 was much shorter and superficial.)
- The third prompt asks the LLM to write a detailed step-by-step blueprint for building the project and break it down into small steps.
- And finally, the fourth prompt asks to create a todo list.
I created a new Go project and added the spec, step-by-step blueprint, and todo list. Then I set Goose's working directory to my project and the model to Claude Sonnet, and let it hack away.
When I glanced at Goose's chat window a few minutes later, I observed that it was caught in a loop. It tried to run a test that errored out. The message was clear and pointed to a syntax error:
./handler_test.go:219:7: undefined: err
./handler_test.go:220:5: undefined: err
./handler_test.go:221:46: undefined: err
That would have been pretty easy to fix (in this case, just by changing a =
to :=
). Yet, Claude didn't seem to understand the error message. It tried various changes (that weren't related to the error at all) and kept getting the error. I had to interrupt the workflow and fix the issue manually. Then Goose/Sonnet happily went on to code and test and code and test.
A while later (I didn't track the time, but I guess Goose took like 30-60 mins), I had a "finished" web service in Go and $9.41 less on my API credits account at Anthropic.
The "finished" project wasn't quite ready for prime time. It contained syntax errors (like, func slog.NewMultiHandler(...)
, a syntax that's plain wrong in Go) and logical errors like passing an incompatible type to a function (database.User
rather than sync.User
). But overall, I guess it saved me some time. I don't know how long it would have taken me to write the same from scratch, but I reckon it would have taken 3–4 days.
Until this issue went to the printing press, I haven't found the time to dig deeper into the generated code and make it work. In the ideal case, the code will work as advertised, and in the worst case, I might have spend as much time for fixing the code as I would have spent to write the code manually. I'll keep you updated on my further findings.
Bottom line: Coding with AI is promising but still requires a knowledgeable person to clean up and fix the code. At the moment, I cannot see how AI agents can fully replace a software developer, but used in the right way, it could certainly be a time saver for experienced developers.
See also the insightful article by Tim O'Reilly in the Completely Unrelated To Go section below.
Quote of the Week: Despised paradigms
I feel like it's a universal truth that for any software language, methodology, or technique someone likes, there exists someone out there who 1) is a way better software engineer than the liker will ever be, and 2) absolutely despises the paradigm.
More articles, videos, talks
mejaz : : ED25519 Digital Signatures In Go
Is this message authentic? If it's cryptographically signed, it probably is. At least, no one could have tampered with it during transmission.
A gentle introduction to ED25519 signatures in Go by Mohd Ejaz Siddiqui.
Join the Go Game Developers Discord Server!
Granted, Go is a niche language for game development. But this shouldn't keep Go game developers from flocking together. Fantasma from the IKEMEN Go community invites Go game devs to a new Discord server .
You don't need Python to build AI products | Lawrence Jones
Python is the AI language—or is it? Lawrence Jones claims it's better to stick with the language you know, and proves this claim with Go.
How to Use the New tool Directive in Go 1.24
Include build-time tools in your Go dependencies! Matt Boyle explains how.
searchcode.com’s SQLite database is probably 6 terabytes bigger than yours | Ben E. C. Boyter
If you have less than six terabytes of data to store, SQLite is probably for you. But this article is also a story of relentless simplification of a PHP-CodeIgniter-MySQL-Memcached-Apache2-Sphinx behemoth that finally turned into a Go-SQLite-Caddy flyweight (except for the database content, that is).
Things I wish I knew about sqlc | Fira's blog
sqlc
is my go-to tool for integrating SQL queries in Go code. Like all tools and techniques that try to mediate between object data and relational data, sqlc
has a few rough edges. Zemfira shares a few tricks to get the best out of sqlc
.
Go team is sneaking Monadish behavior into the standard library
Are Functional Programming idioms entering Go through the backdoor? Jarrod Roberson thinks so: "iter.Seq/iter.Seq2 is a very Monadish way of iterating of a sequence of data and I really like it."
Projects
Libraries
GitHub - khatibomar/fulus: type-safe Go money library
fulus
has what a good financial library needs: safe integer arithmetic instead of floating-point types and type-safe money and concurrency operations.
GitHub - yaitoo/xun: Xun is an HTTP web framework built on Go's built-in html/template and net/http package’s router (1.22).
Back to the roots: While HTMX and Templ are the current hype, Xun relies on Go's standard router and templates.
GitHub - starskey-io/starskey: Package for fast persistent and embedded key-value storage. LevelDB-WiscKey inspired.
Starskey is fast but not blazingly fast because the term "blazingly fast" is occupied by Rust.
GitHub - noboruma/go-msquic: QUIC/HTTP3 library wrapper around msquic
Like quic-go
but faster. And depending on a C library.
GitHub - michal-laskowski/wax: Generate HTML on the server side with TSX/JSX templates in Go
Server-side rendering (SSR) reduces initial load times, enhances SEO, and improves the user experience. WAX brings JSX-based SSR to Go.
Tools and applications
GitHub - gopher-fleece/gleece: Building, documenting, validating securing and customizing REST APIs through code-first development
Function annotations in Go? Yes, if you want code-first API development and use Gleece
GitHub - David-Orson/go-mastery
Like the Go Tour but with less syntax being shown so that the user has to work more from their memory. The author uses this to refresh their memory muscle for basic syntax, especially after having worked with the language server and copilot (that happily "help" you to unlearn basic syntax), or even with another language, for an extended period of time.
Go Repos
Want to explore some Go projects but have no idea where to start? Go Repos serves random Go repos, 16 at a time.
GitHub - GianlucaP106/minecraft: Minecraft clone from scratch with only modern OpenGL
Writing a Minecraft clone in Go is impressive. Doing this without any gaming engine is doubly impressive. (Basic game mechanics only, but still...!)
GitHub - znscli/zns: CLI tool for querying DNS records with readable, colored output.
Most DNS query tools deliver more or less cryptic output. zns
focuses on readability.
Completely unrelated to Go
Do you use a debugger?
Debuggers: To use or not to use? Sandor Dargo has observed that the decision often depends on the codebase.
Can I ethically use LLMs?
Discussions about AI are often dominated by either AI enthusiasts or steadfast opponents. Nicole Tietz-Sokolskaya rejects black-or-white thinking and inspects varous facets of AI and their effect on ethical use of AI.
Why Software Developers Will Thrive in Citizen AI Development Age
Will AI replace all software engineers? Not at all, says B (real name: Bjørn Furuknap), and the reason that prevents this from happening is... feature creep.
The End of Programming as We Know It
Tim O'Reilly puts the AI revolution into perspective by zooming out—far out, until the various economic revolutions of the past become visible. The learning: To survive an economic revolution, you have to adapt.

Happy coding! ʕ◔ϖ◔ʔ
Questions or feedback? Drop me a line. I'd love to hear from you.
Best from Munich, Christoph
Not a subscriber yet?
If you read this newsletter issue online, or if someone forwarded the newsletter to you, subscribe for regular updates to get every new issue earlier than the online version, and more reliable than an occasional forwarding.
Find the subscription form at the end of this page.
How I can help
If you're looking for more useful content around Go, here are some ways I can help you become a better Gopher (or a Gopher at all):
On AppliedGo.net, I blog about Go projects, algorithms and data structures in Go, and other fun stuff.
Or visit the AppliedGo.com blog and learn about language specifics, Go updates, and programming-related stuff.
My AppliedGo YouTube channel hosts quick tip and crash course videos that help you get more productive and creative with Go.
Enroll in my Go course for developers that stands out for its intense use of animated graphics for explaining abstract concepts in an intuitive way. Numerous short and concise lectures allow you to schedule your learning flow as you like.
Christoph Berger IT Products and Services
Dachauer Straße 29
Bergkirchen
Germany