<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Go-Idioms on Bits, Trades &amp; Systems</title>
    <link>https://blog.turboawesome.win/series/go-idioms/</link>
    <description>Recent content in Go-Idioms on Bits, Trades &amp; Systems</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 07 Oct 2025 09:15:00 +0000</lastBuildDate>
    <atom:link href="https://blog.turboawesome.win/series/go-idioms/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Migrating a Production Service from Zap to slog: Notes from the Trenches</title>
      <link>https://blog.turboawesome.win/2025/10/migrating-a-production-service-from-zap-to-slog-notes-from-the-trenches/</link>
      <pubDate>Tue, 07 Oct 2025 09:15:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2025/10/migrating-a-production-service-from-zap-to-slog-notes-from-the-trenches/</guid>
      <description>log/slog landed in the standard library in Go 1.21, but most production services are still on zap or zerolog. Here is what an actual migration looks like: where slog wins, where zap still wins, and how to move incrementally without a big-bang rewrite.</description>
    </item>
    <item>
      <title>Go 1.23 Range Over Functions: What It&#39;s For and What It Isn&#39;t</title>
      <link>https://blog.turboawesome.win/2025/06/go-1.23-range-over-functions-what-its-for-and-what-it-isnt/</link>
      <pubDate>Wed, 18 Jun 2025 09:00:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2025/06/go-1.23-range-over-functions-what-its-for-and-what-it-isnt/</guid>
      <description>Go 1.23 shipped range over functions — the ability to range over an iterator function rather than a slice, map, or channel. The feature is genuinely useful for a specific class of problems and genuinely misunderstood by engineers reaching for it in places where a slice works better.</description>
    </item>
    <item>
      <title>Go&#39;s Race Detector in CI: Catching Data Races Before They Catch You</title>
      <link>https://blog.turboawesome.win/2023/10/gos-race-detector-in-ci-catching-data-races-before-they-catch-you/</link>
      <pubDate>Wed, 04 Oct 2023 09:35:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2023/10/gos-race-detector-in-ci-catching-data-races-before-they-catch-you/</guid>
      <description>Data races are among the hardest bugs to find and reproduce. Go&amp;#39;s built-in race detector finds them automatically — if you run it. Here&amp;#39;s how to integrate it into CI effectively and what to do when it fires.</description>
    </item>
    <item>
      <title>Go&#39;s net/http: Building Production HTTP Servers Without a Framework</title>
      <link>https://blog.turboawesome.win/2023/07/gos-net/http-building-production-http-servers-without-a-framework/</link>
      <pubDate>Wed, 05 Jul 2023 10:44:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2023/07/gos-net/http-building-production-http-servers-without-a-framework/</guid>
      <description>Go&amp;#39;s standard net/http package is capable enough for most production workloads without a framework. What &amp;#39;capable enough&amp;#39; means in practice, and the patterns for middleware, graceful shutdown, and observability.</description>
    </item>
    <item>
      <title>Database Access Patterns in Go: sqlx, pgx, and When to Use an ORM</title>
      <link>https://blog.turboawesome.win/2023/04/database-access-patterns-in-go-sqlx-pgx-and-when-to-use-an-orm/</link>
      <pubDate>Wed, 05 Apr 2023 11:22:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2023/04/database-access-patterns-in-go-sqlx-pgx-and-when-to-use-an-orm/</guid>
      <description>The Go database access landscape — database/sql, sqlx, pgx, GORM, sqlc — each makes different tradeoffs. Here&amp;#39;s what works for different use cases and why the common advice to avoid ORMs is sometimes right and sometimes not.</description>
    </item>
    <item>
      <title>Writing Idiomatic Go</title>
      <link>https://blog.turboawesome.win/2023/01/writing-idiomatic-go/</link>
      <pubDate>Wed, 11 Jan 2023 10:00:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2023/01/writing-idiomatic-go/</guid>
      <description>Idiomatic Go is not just stylistic preference — it reflects how the language is designed to be used. The patterns that experienced Go engineers reach for, and why they work better than the alternatives.</description>
    </item>
    <item>
      <title>Structured Logging in Go: slog, zerolog, and What Actually Matters</title>
      <link>https://blog.turboawesome.win/2022/11/structured-logging-in-go-slog-zerolog-and-what-actually-matters/</link>
      <pubDate>Wed, 23 Nov 2022 10:58:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2022/11/structured-logging-in-go-slog-zerolog-and-what-actually-matters/</guid>
      <description>The Go ecosystem has converged on structured logging, but the choice of library and the conventions you adopt matter more than the specific API. Here&amp;#39;s what structured logging should look like in a production Go service and why.</description>
    </item>
    <item>
      <title>Memory Layout in Go: Structs, Alignment, and Cache Performance</title>
      <link>https://blog.turboawesome.win/2022/08/memory-layout-in-go-structs-alignment-and-cache-performance/</link>
      <pubDate>Wed, 17 Aug 2022 10:03:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2022/08/memory-layout-in-go-structs-alignment-and-cache-performance/</guid>
      <description>Go&amp;#39;s struct layout follows alignment rules that affect both memory consumption and cache performance. Understanding them matters more than most Go developers realise.</description>
    </item>
    <item>
      <title>OpenTelemetry in Go: Distributed Tracing That Doesn&#39;t Get in the Way</title>
      <link>https://blog.turboawesome.win/2022/05/opentelemetry-in-go-distributed-tracing-that-doesnt-get-in-the-way/</link>
      <pubDate>Tue, 31 May 2022 10:14:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2022/05/opentelemetry-in-go-distributed-tracing-that-doesnt-get-in-the-way/</guid>
      <description>OpenTelemetry standardised distributed tracing across languages and vendors. Here&amp;#39;s what idiomatic OTel integration looks like in Go — and the parts that aren&amp;#39;t obvious from the documentation.</description>
    </item>
    <item>
      <title>Embedding in Go: Composition Over Inheritance Done Right</title>
      <link>https://blog.turboawesome.win/2022/01/embedding-in-go-composition-over-inheritance-done-right/</link>
      <pubDate>Wed, 05 Jan 2022 10:08:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2022/01/embedding-in-go-composition-over-inheritance-done-right/</guid>
      <description>Go has no inheritance, but it has embedding — a composition mechanism that promotes methods to the outer type. Understanding what embedding actually does (and what it doesn&amp;#39;t) prevents the common mistakes.</description>
    </item>
    <item>
      <title>Building Reliable Pipelines with Go: Retry, Circuit Breaker, and Backoff</title>
      <link>https://blog.turboawesome.win/2021/11/building-reliable-pipelines-with-go-retry-circuit-breaker-and-backoff/</link>
      <pubDate>Wed, 17 Nov 2021 11:41:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2021/11/building-reliable-pipelines-with-go-retry-circuit-breaker-and-backoff/</guid>
      <description>Every service that calls another service will eventually face failures. The patterns that contain those failures — retry with backoff, circuit breakers, bulkheads — are not optional for production Go services. Here&amp;#39;s how to implement them correctly.</description>
    </item>
    <item>
      <title>Go 1.18 Generics: Real Use Cases Worth the Complexity</title>
      <link>https://blog.turboawesome.win/2021/04/go-1.18-generics-real-use-cases-worth-the-complexity/</link>
      <pubDate>Wed, 07 Apr 2021 10:29:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2021/04/go-1.18-generics-real-use-cases-worth-the-complexity/</guid>
      <description>Go 1.18 shipped generics and the ecosystem immediately split between &amp;#39;finally&amp;#39; and &amp;#39;we didn&amp;#39;t need this.&amp;#39; After using them in production code, here are the cases where generics genuinely simplify things and the cases where they add complexity for no gain.</description>
    </item>
    <item>
      <title>gRPC in Production: Lessons After Two Years</title>
      <link>https://blog.turboawesome.win/2021/01/grpc-in-production-lessons-after-two-years/</link>
      <pubDate>Wed, 13 Jan 2021 14:55:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2021/01/grpc-in-production-lessons-after-two-years/</guid>
      <description>gRPC is a better default than REST for internal service communication. It&amp;#39;s also a set of new problems you didn&amp;#39;t have before. Two years of production experience.</description>
    </item>
    <item>
      <title>Generics Are Coming to Go: What the Proposal Actually Solves</title>
      <link>https://blog.turboawesome.win/2020/10/generics-are-coming-to-go-what-the-proposal-actually-solves/</link>
      <pubDate>Mon, 05 Oct 2020 11:13:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2020/10/generics-are-coming-to-go-what-the-proposal-actually-solves/</guid>
      <description>The generics proposal for Go landed in 2020 and the feature shipped in Go 1.18. Here&amp;#39;s what the design was targeting, what it actually enables, and why the &amp;#39;just use interface{}&amp;#39; crowd was always missing the point.</description>
    </item>
    <item>
      <title>Go&#39;s Scheduler: GOMAXPROCS, Work Stealing, and Why It Matters</title>
      <link>https://blog.turboawesome.win/2020/08/gos-scheduler-gomaxprocs-work-stealing-and-why-it-matters/</link>
      <pubDate>Wed, 12 Aug 2020 10:27:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2020/08/gos-scheduler-gomaxprocs-work-stealing-and-why-it-matters/</guid>
      <description>Go&amp;#39;s M:N scheduler is one of the reasons goroutines are cheap enough to use liberally. Understanding how it works changes how you reason about concurrency bugs and performance anomalies.</description>
    </item>
    <item>
      <title>Building a High-Throughput Event Pipeline in Go Without Losing Your Mind</title>
      <link>https://blog.turboawesome.win/2020/07/building-a-high-throughput-event-pipeline-in-go-without-losing-your-mind/</link>
      <pubDate>Wed, 01 Jul 2020 14:30:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2020/07/building-a-high-throughput-event-pipeline-in-go-without-losing-your-mind/</guid>
      <description>Channels are Go&amp;#39;s concurrency primitive, but a naive pipeline of goroutines and channels won&amp;#39;t survive high throughput. The patterns that scale: batching, backpressure, worker pools, and knowing when to abandon channels entirely.</description>
    </item>
    <item>
      <title>Profiling Go Services in Production with pprof</title>
      <link>https://blog.turboawesome.win/2020/04/profiling-go-services-in-production-with-pprof/</link>
      <pubDate>Wed, 01 Apr 2020 10:18:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2020/04/profiling-go-services-in-production-with-pprof/</guid>
      <description>Go&amp;#39;s pprof tooling is built in, low-overhead, and more useful than most engineers realise. Here&amp;#39;s how to capture CPU and memory profiles from production services and actually read what they tell you.</description>
    </item>
    <item>
      <title>Go Benchmarks: Writing Ones That Actually Tell You Something</title>
      <link>https://blog.turboawesome.win/2020/03/go-benchmarks-writing-ones-that-actually-tell-you-something/</link>
      <pubDate>Tue, 17 Mar 2020 09:29:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2020/03/go-benchmarks-writing-ones-that-actually-tell-you-something/</guid>
      <description>Go&amp;#39;s built-in benchmark framework is excellent, but it&amp;#39;s easy to write benchmarks that measure the wrong thing — compiler optimisations, cache warming artifacts, or benchmark overhead rather than the code under test.</description>
    </item>
    <item>
      <title>Context Propagation in Go: Deadlines, Cancellation, and Tracing</title>
      <link>https://blog.turboawesome.win/2020/02/context-propagation-in-go-deadlines-cancellation-and-tracing/</link>
      <pubDate>Wed, 19 Feb 2020 11:14:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2020/02/context-propagation-in-go-deadlines-cancellation-and-tracing/</guid>
      <description>Go&amp;#39;s context package is one of the most important idioms in the language. Used well it enables clean cancellation and distributed tracing. Used poorly it becomes a magic bag of values that creates invisible dependencies.</description>
    </item>
    <item>
      <title>Go Module System: Dependency Management Done Right (Mostly)</title>
      <link>https://blog.turboawesome.win/2020/01/go-module-system-dependency-management-done-right-mostly/</link>
      <pubDate>Wed, 08 Jan 2020 09:15:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2020/01/go-module-system-dependency-management-done-right-mostly/</guid>
      <description>Go modules replaced GOPATH in 1.11 and became the default in 1.16. The design is genuinely good — reproducible builds, minimal version selection, explicit dependencies. The rough edges are worth knowing in advance.</description>
    </item>
  </channel>
</rss>
