Go

Technical Journal // Go
Apr '26

Why Your Goroutines Need a Speed Limit: Bounded Concurrency in Go

Unbounded concurrency is a reliability nightmare. Learn how to protect your system from OOM kills and database exhaustion by implementing Semaphores and Worker Pools in Go.

Apr '26

Part 2: Decoupling the Renderer: Terminal to Raylib in One Interface

If your game logic knows about OpenGL, your architecture has failed. This post dissects the Interface Segregation Principle in Go, demonstrating how the Derelict Facility engine swapped an ANSI terminal renderer for hardware-accelerated Raylib without changing a single line of game simulation code.

Apr '26

Part 1: Data-Oriented Design in Go: Why [][]Tile Destroyed My Game Engine

The textbook answer for a 2D grid in Go is a slice of slices. In a systems-level game engine running at 60 FPS, this innocent data structure becomes a performance landmine. This post explores pointer chasing, CPU cache lines, and how flattening a 2D map into contiguous memory creates massive performance gains through Data-Oriented Design.

Mar '26

Understanding CPU Caches in Go

A practical guide to understanding how CPU caches (L1/L2/L3) impact Go service performance, with benchmarks on modern hardware.

Mar '26

The WSL2 Performance Tax: Why Your Go Apps Are Slow on Windows

If you're building Go applications on WSL2 and keeping your source code on the Windows filesystem, you're paying a hidden performance tax on every build. Here is how to reclaim your CPU cycles.

Mar '26

What is a Mutex?

What is a mutex?

Jan '26

Go Struct Field Alignment

Your Go structs might be wasting up to 32% of their memory due to invisible padding bytes. This deep dive into struct field alignment reveals how the compiler arranges memory, why field order matters, and provides benchmarks showing real memory savings. Learn the simple reordering rules that can shrink your heap, reduce GC pressure, and improve CPU cache efficiency.

Jan '26

Memory Mechanics In Go - Stack vs Heap

When thinking about performance, it's easy to focus on Big O notation. But in Go, the difference between the Stack and the Heap is often the difference between a service that scales and one that chokes on GC pauses. This post explores escape analysis, the "Pointer Myth", and why passing by value is often 40x faster than passing by pointer.

Jan '26

Go GC Deep Dive: How to Reduce Latency and Allocation Pressure in Production

"Why is our service slow?" "I don't know, the heap is only 200MB". "But we're allocating... wait, how much?" "12 terabytes". "...in how long?" "30 seconds profile". That's when we realized: we weren't running a service. We were running a garbage factory that occasionally served API requests. The Go garbage collector was heroically trying to clean up our mess, and we were blaming it for not cleaning fast enough. This deep dive into GC internals, profiling tools, and production war stories will teach you how to stop fighting the garbage collector and start working with it.

Apr '25

Bitmasking In Go

Bitmasking is one of those computer science tricks that feels like wizardry, until you realize it's just some clever shifting and binary math. This blog explores the idea, shows how we use it in Go, and why it's surprisingly useful when working with databases like Couchbase.