Everyone's Favorite Route • The Applied Go Weekly Newsletter 2025-01-19
Your weekly source of Go news, tips, and projects
Everyone's Favorite Route
Hi ,
You need marketing, they say. You can build a great product and nobody would take notice if you don't market it, they say.
But sometimes, magic happens: You create something to solve your own problem, and it turns out countless others were struggling with the exact same thing. Before you know it, your project takes off, finding its way into hundreds of other projects.
That's exactly what happened with a seemingly mundane routing table package. Read the full story in this week's Spotlight – but don't you dare skip the Featured Articles and Podcast Corner! (I mean, why else would I carefully curate them for you?)
Featured articles
Go 1.24 interactive tour
Play with Go 1.24 in your browser, before it's even released. Powered by codapi.org.
How HTTP/2 Works and How to Enable It in Go
All you ever wanted to know about HTTP/2, including the cases when it's disabled in net/http
.
Go Interfaces: Why, How and When | nyadgar.com
Even though interfaces decouple behavior from implementation, using them in a wrong way can leak implementation details and create unwanted hard dependencies. This article explains interfaces so well that you cannot use them wrongly anymore. I guess.
Podcast corner
🎤 A nil microphone won't keep us away from the 1.24 Interactive Tour or trying Hugo's new features
Jonathan and Shay are back, with a mix of new releases, proposal status updates, and a weird mic.
Spotlight: BART, the little routing table package that became indispensable (a success story)
If a package implements an algorithm known from an academic paper only, what's the probability of reaching widespread use?
In case of gaissmai/bart
, the probability is 1, as it already happened. Numerous users, including some well-known companies, use bart
in their projects. But what does bart
do?
The package implements a balanced routing table whose design is based on Donald E. Knuth's Allotment Routing Table (ART) algorithm. (The paper linked above describes the ART algorithm in detail. The author isn't Don Knuth; don't let this confuse you. See the Acknowledgements section on page 11.)
"Balanced routing table", you might think, "yeah, so what?"
Routers and network hosts use routing tables to store IP routes to particular network destinations. A major challenge of designing routing tables is the need to store large amounts of routes and retrieve them quickly. Charly Gaissmaier (a former Master Go student, BTW) sat down to write a routing library for his own purposes. The library implements a balanced routing table (hence the package name bart
) that improves upon the original ART algorithm in terms of memory usage.
Charly didn't stop after the first iteration. He continued working on the code to improve lookup performance, memory usage, and update performance, until bart
became the best-in-town package for these metrics.
Benchmarks reveal that –
bart
is the fastest software algorithm for IP address lookup in routing tables.bart
has two orders of magnitude lower memory consumption compared toart
and is similar in low memory consumption to (…)cidrtree
but much faster in lookup times.bart
is by far the fastest algorithm for inserts and one of the fastest for delete.
(cited from the readme)
Wow. That's not too shabby for a routing table package, is it?
But it gets even better: Although it would seem that few projects need routing tables, the package has accumulated over 260 dependent packages and, including indirect dependencies, over 320 dependent repositories. 🥳
Among bart
's users are well-known companies and popular projects, including Tailscale, Slack, ProjectDiscovery, Clickhouse, Control D, Daytona, and more, enjoying swift and memory-conserving routing table operations.
Fast, memory-efficient, and popular… talk about routing your way to the top!
Quote of the Week: 3 Hours Or Nothing.
Rule #1: don’t agree to anything “quick” unless you’re willing to spend 3+ hours on it.
More articles, videos, talks
Making Beautiful API Keys | Let's Build Together
I am not sure if beauty is a key requirement for API keys. As far as I'm concerned, an API key can be ugly as heck as long as I can copy&paste it in one go. For some scenarios, though, it helps if the key is time-sortable and indexable. For these reasons, uuidkey
was born.
How rqlite is tested – Vallified
Rqlite is a distributed SQLite variant. Testing it requires more than just a couple of unit tests. Philip O'Toole shares his test setup, from unit to end-to-end tests.
Random Art Algorithm - YouTube
Do you know these ASCII art images that ssh-keygen
generates? These images are called Random Art and are great for visualizing hash values, as this video demonstrates.
Writing & Testing a Paginated API Iterator in Go
Iterator functions are useful for a wide array of use cases. Thibaut Rousseau uses them to iterate through paginated API responses.
The GoLand 2025.1 Early Access Program Has Started! | The GoLand Blog
JetBrain has started another Early Access Program, where devs can test the latest GoLand Beta for a limited time, for free.
Projects
Libraries
GitHub - jokruger/dec128: 128-bit fixed-point decimal numbers in go.
Of what use are 128-bit floats? /u/FractalFaro
has a compelling use case: "Sweet! I'm going to use this to zoom in even more on the Mandelbrot set."
GitHub - aeilang/httpz: Lightweight net/http 1.22+ enhancement library that combines the best of chi & Echo Enabling you to effortlessly write handlers using net/http
httpz
's aim is to make net/http version 1.22 more user-friendly (like Echo) while keeping stdlib compatibility (like chi).
GitHub - utkusen/baitroute: A web honeypot library to create vulnerable-looking endpoints to detect and mislead attackers
Keep your attackers busy with this honeypot. Maybe not ready for production (yet). As /u/Deadly_chef
point out, "It's all fun and games until your bait endpoint has an actual vulnerability"
Tools and applications
GitHub - MatthewAraujo/bottle_watter: Water Bottle Progress Tracker is a simple Go app to help you track your daily water intake
Waiting for an upgrade that can measure the water flow through the bottle neck
GitHub - BJS-kr/animalized-server
A project template for multiplayer game servers. Despite being a template, animalized-server
comes with a ready-to-play demo game.
GitHub - DepsHubHQ/depshub: Dependency management tool: linter, updater, security scanner and more!
Linters lint your code. This linter lints your dependency configuration. Want to ensure to use no deprecated packages, or only tagged versions? Depshub does this and more for Go, Rust, Python, and JS/TS dependency managers.
GitHub - elliot40404/modo: A cross platform cli app to interact with markdown style checkboxes within any text file
Are you writing your todo lists in Markdown and wish for a simple & easy CLI tool to interactively check off your todos? Well, here it is.
GitHub - sanda0/linodsync: Linodsync is a Go-based application designed to back up your project directories and databases on a server to Linode Object Storage.
In contrast to generic S3 upload or backup tools, Linodesync "simplifies backups with project-specific JSON configurations, integrates database support, automates tasks via systemd, manages retention policies." Specific to Linode, however.
GitHub - orme292/s3packer: s3packer is an S3-Compatible object storage profile-based backup & upload application, written in Go. Works with AWS S3, OCI Object Storage, Akamai (Linode) Object Storage.
Author: "I finally built something that does something and I'm excessively proud of it, so I want to share it."
GitHub - tferdous17/genesis: High-performance distributed key-value store w/ a log-structured merge tree implementation written in pure Go + gRPC
A distributed key-value store implemented as a log-structured merge (LSM) tree. For educational purposes.
GitHub - ystepanoff/ParaGopher: Retro-style arcade game. Defend your base!
Nostalgia! ParaGopher is a 2D arcade game inspired by the 1982 (!) game Paratrooper.
Completely unrelated to Go
Multiplicative Systems: Understanding The Power of Multiplying by Zero
We like to think of a system (say, your current project, a business, or your next career step) as built from parts, or aspects, that sum up. In reality, the aspects are often multiplications rather than additions. This "little" difference has a severe ramification: When one aspect is missing, the whole system comes to naught.
Cleaning up Notes with LLM
"How can you have an LLM clean up your notes without risking that the LLM messes them up? Karan Sharma wrote a script that asks an LLM to read Markdown notes and suggest suitable frontmatter for each (content-derived tags, etc). Neither the original frontmatter nor the text itself are modified. Neat!"

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