<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet type="text/css" href="/css/rss.css"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Spotlights on Applied Go</title><link>https://appliedgo.net/spotlight/</link><description>Recent content in Spotlights on Applied Go</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><managingEditor>Christoph Berger</managingEditor><webMaster>chris@appliedgo.net</webMaster><copyright>This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.</copyright><lastBuildDate>Tue, 13 Aug 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://appliedgo.net/spotlight/index.xml" rel="self" type="application/rss+xml"/><item><title>Little Helper</title><link>https://appliedgo.net/spotlight/little-helper/</link><pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/little-helper/</guid><description>Do not reject AI for taking the joy of coding away from you. Rather, use them in smart ways that reduce chore but keep you in control.</description></item><item><title>The Best Language for AI-Assisted Coding Is...</title><link>https://appliedgo.net/spotlight/the-best-language-for-ai-assisted-coding/</link><pubDate>Sun, 12 Apr 2026 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/the-best-language-for-ai-assisted-coding/</guid><description>LLM coding is on the rise. Will today's programming languages become obsolete? Or will any language do, because the advantages of a particular language become irrelevant?</description></item><item><title>The Lethal Trifecta (and how to avoid it)</title><link>https://appliedgo.net/spotlight/lethal-trifecta-avoid-with-go/</link><pubDate>Sun, 22 Feb 2026 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/lethal-trifecta-avoid-with-go/</guid><description>A new attack targets LLMs that can access your data and the internet. The remedy: just don't let them. It's easier than you might think.</description></item><item><title>On testing: "Does it work?" vs. "Does it fulfill the contract?"</title><link>https://appliedgo.net/spotlight/contract-tests/</link><pubDate>Sun, 01 Feb 2026 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/contract-tests/</guid><description>Do you rigorously distinguish between black-box and white-box testing? The distinction matters a lot, and with Go, it takes no effort to implement either kind of test.</description></item><item><title>AI and Go in 2026</title><link>https://appliedgo.net/spotlight/ai-and-go/</link><pubDate>Thu, 01 Jan 2026 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/ai-and-go/</guid><description>AI for Go development, in Go apps, and written in Go. A list.</description></item><item><title>Mechanical Sympathy</title><link>https://appliedgo.net/spotlight/mechanical-sympathy/</link><pubDate>Sun, 30 Nov 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/mechanical-sympathy/</guid><description>Go puts the developer quite close to the hardware. Understanding what's going on behind the curtains is a tactical advantage for every developer.</description></item><item><title>Go as a Scripting Language for Atuin Runbooks</title><link>https://appliedgo.net/spotlight/go-as-a-scripting-language-for-atuin-runbooks/</link><pubDate>Sun, 12 Oct 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/go-as-a-scripting-language-for-atuin-runbooks/</guid><description>Write shell scripts as you'd write a book, with runnable Go code snippets</description></item><item><title>The Cost of (Avoiding) Dependencies</title><link>https://appliedgo.net/spotlight/the-cost-of-avoiding-dependencies/</link><pubDate>Sun, 05 Oct 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/the-cost-of-avoiding-dependencies/</guid><description>'Minimize dependencies, use the standard library!' is a well-known advice.</description></item><item><title>Go SaaS Lab 01: A Not-So-Minimal Web Server</title><link>https://appliedgo.net/spotlight/saas-lab-01-a-not-so-minimal-web-server/</link><pubDate>Sat, 20 Sep 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/saas-lab-01-a-not-so-minimal-web-server/</guid><description>Start small, stay small: the core of a minimalist SaaS platform</description></item><item><title>Building A Minimalist SaaS Platform</title><link>https://appliedgo.net/spotlight/a-minimalist-saas-platform-01-intro/</link><pubDate>Sun, 14 Sep 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/a-minimalist-saas-platform-01-intro/</guid><description>Less code, more go: How to build a web presence, a CMS, or a web app without drowning in dependencies</description></item><item><title>Why Go Is a Minimalist Language</title><link>https://appliedgo.net/spotlight/why-go-is-a-minimalist-language/</link><pubDate>Sun, 07 Sep 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/why-go-is-a-minimalist-language/</guid><description>Go has a small language specification, but does this make it a language for minimalist development?</description></item><item><title>So You Dont Like Go?</title><link>https://appliedgo.net/spotlight/so-you-dont-like-go/</link><pubDate>Sun, 31 Aug 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/so-you-dont-like-go/</guid><description>Language criticism can be useful if it doesn't decline into mere nitpicking for the sake of it.</description></item><item><title>Handle With Care (LLM Security)</title><link>https://appliedgo.net/spotlight/handle-with-care-llm-security/</link><pubDate>Sun, 24 Aug 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/handle-with-care-llm-security/</guid><description>LLMs are vulnerable to prompt injection and other attacks. Defense is difficult but insispensable.</description></item><item><title>Commit Messages That Write Themselves (Go and AI)</title><link>https://appliedgo.net/spotlight/commit-messages-that-write-themselves/</link><pubDate>Sun, 17 Aug 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/commit-messages-that-write-themselves/</guid><description>Is combining Go and AI of any use? Yes, and even smallest tasks may benefit from a little artificial smartassing.</description></item><item><title>Blue Gopher Meets Stochastic Parrot: About Go and AI</title><link>https://appliedgo.net/spotlight/blue-gopher-meets-stochastic-parrot-go-and-ai/</link><pubDate>Sun, 10 Aug 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/blue-gopher-meets-stochastic-parrot-go-and-ai/</guid><description>When Go and AI team up, endless possibilities emerge.</description></item><item><title>You're lucky, full moon tonight! (How to Write an MCP Server in Go)</title><link>https://appliedgo.net/spotlight/write-an-mcp-server-in-go/</link><pubDate>Sun, 03 Aug 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/write-an-mcp-server-in-go/</guid><description>LLMs can just chat, unless you give them tools for working with files, searching the web, or... determining the current phase of the moon.</description></item><item><title>How To Call An LLM From Go</title><link>https://appliedgo.net/spotlight/call-an-llm-from-go/</link><pubDate>Sun, 27 Jul 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/call-an-llm-from-go/</guid><description>Some tasks cannot be turned into an algorithm, or only with great difficulty. Large Language Models (LLMs) to the rescue!</description></item><item><title>New And Improved Formula! (JSON v2 in Go 1.25)</title><link>https://appliedgo.net/spotlight/go-1.25-json-v2/</link><pubDate>Sun, 20 Jul 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/go-1.25-json-v2/</guid><description/></item><item><title>Don't Mess With My Site! (New in Go 1.25: CrossOriginProtection)</title><link>https://appliedgo.net/spotlight/csrf-dont-mess-with-my-site/</link><pubDate>Sun, 13 Jul 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/csrf-dont-mess-with-my-site/</guid><description>Fighting cross-site request forgery (CSRF) becomes easier in Go 1.25, thanks to the new cross origin protection feature.</description></item><item><title>(Don't) Leave No Trace: Capture The Context of Significant Events With trace.FlightRecorder (New in Go 1.25)</title><link>https://appliedgo.net/spotlight/go-1.25-flightrecorder/</link><pubDate>Sun, 06 Jul 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/go-1.25-flightrecorder/</guid><description>Why should you let tracing pile up huge amounts of data when you need only a few seconds of trace output? Meet FlightRecorder.</description></item><item><title>Container-Aware GOMAXPROCS (New in Go 1.25)</title><link>https://appliedgo.net/spotlight/go-1.25-container-aware-gomaxprocs/</link><pubDate>Mon, 30 Jun 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/go-1.25-container-aware-gomaxprocs/</guid><description>Before Go 1.25, GOMAXPROCS defaults to the number of available physical CPU cores at app startup time. Now it takes container limits into account and checks changes periodically.</description></item><item><title>New in Go 1.25: WaitGroup.Go()</title><link>https://appliedgo.net/spotlight/go-1.25-waitgroup-go/</link><pubDate>Sun, 22 Jun 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/go-1.25-waitgroup-go/</guid><description>WaitGroups are a means of synchronizing goroutines; yet the Add()/defer Done() idiom feels clumsy and is error-prone. A new method, Go(), puts an end to goroutine counting.</description></item><item><title>The Synctest Package (new in Go 1.25)</title><link>https://appliedgo.net/spotlight/go-1.25-the-synctest-package/</link><pubDate>Sun, 15 Jun 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/go-1.25-the-synctest-package/</guid><description>Tests that rely on time.Sleep() to test timings can be unreliable and slow. The synctest package introduces two antidotes: fake time and</description></item><item><title>Own Your Errors! (Hard Truths About Go Error Handling)</title><link>https://appliedgo.net/spotlight/hard-truths-about-go-error-handling/</link><pubDate>Sun, 08 Jun 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/hard-truths-about-go-error-handling/</guid><description>The Go team decided to put an end to error handling syntax proposals. Time for a refresher on the kind of error handling that works well since 2009.</description></item><item><title>Atomic Functions or Methods</title><link>https://appliedgo.net/spotlight/atomic-functions-or-methods/</link><pubDate>Sun, 01 Jun 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/atomic-functions-or-methods/</guid><description>The sync/atomic package recommends using atomic types and their methods instead of the package-level atomic functions. For good reasons.</description></item><item><title>WebAssembly in 5 Minutes</title><link>https://appliedgo.net/spotlight/webassembly-in-5-minutes/</link><pubDate>Sun, 25 May 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/webassembly-in-5-minutes/</guid><description>Compiling Go code into a WebAssembly module is easy as pie. Getting the code to interact with the browser requires a few lines of Javascript, but it's less complicated than you might think.</description></item><item><title>Pixel Perfect: Display Images in The Go Playground</title><link>https://appliedgo.net/spotlight/pixel-perfect-display-images-in-go-playground/</link><pubDate>Sun, 18 May 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/pixel-perfect-display-images-in-go-playground/</guid><description>Programs in the Go Playground can print text to a space below the code editor. With a simple trick, you can even output PNG images.</description></item><item><title>Tuppers Self-Referential Formula</title><link>https://appliedgo.net/spotlight/tuppers-self-referential-formula/</link><pubDate>Sun, 11 May 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/tuppers-self-referential-formula/</guid><description>A formula that describes a picture of itself? How is that possible...?!</description></item><item><title>Green Tea Makes Your Life Easier (If You're A Garbage Collector)</title><link>https://appliedgo.net/spotlight/green-tea-garbage-collector/</link><pubDate>Sun, 04 May 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/green-tea-garbage-collector/</guid><description>The Go team develops a new garbage collector algorithm suitable for multicore CPU architectures and non-uniform memory. You can try it now!</description></item><item><title>Security: The Habits That Matter Most</title><link>https://appliedgo.net/spotlight/security-habits-that-matter-most/</link><pubDate>Sun, 27 Apr 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/security-habits-that-matter-most/</guid><description>Security is more crucial than ever. Making security an afterthought is a footgun. Learn how to write secure Go code from the start.</description></item><item><title>Final Destination: Go?</title><link>https://appliedgo.net/spotlight/final-destination-go/</link><pubDate>Sun, 20 Apr 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/final-destination-go/</guid><description>After a long (and exciting) journey through umpteenth of programming languages, I arrived at Go and finally feel at home.</description></item><item><title>Go Doesn't Like Import Cycles</title><link>https://appliedgo.net/spotlight/no-import-cycles/</link><pubDate>Sun, 13 Apr 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/no-import-cycles/</guid><description>Programming language theory doesn't rule out import cycles ... but this doesn't make them a good idea.</description></item><item><title>No Risk, No Fun? Beware Of Careless Use Of MCP</title><link>https://appliedgo.net/spotlight/mcp-security/</link><pubDate>Sun, 06 Apr 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/mcp-security/</guid><description>Letting an LLM code some tool in Go can be nice, especially when it uses tools via MCP. But there are some risks involved.</description></item><item><title>Functions In Templates—Embrace Or Avoid?</title><link>https://appliedgo.net/spotlight/functions-in-templates-funcmap/</link><pubDate>Sun, 30 Mar 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/functions-in-templates-funcmap/</guid><description>Go's templates allow defining custom functions for use inside the template. Nice, but type safety gets overboard. Are they still worth using?</description></item><item><title>Option Types</title><link>https://appliedgo.net/spotlight/option-types/</link><pubDate>Sun, 23 Mar 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/option-types/</guid><description>Are option types a good idea, or are they just syntactic sugar?</description></item><item><title>Optimize Memory Usage With slices.Clip ... NOT!</title><link>https://appliedgo.net/spotlight/slices-clip/</link><pubDate>Sun, 16 Mar 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/slices-clip/</guid><description>Clipping a slice doesn't free any memory. What is slices.Clip() good for then?</description></item><item><title>Optimizing A Codebase By Porting It To Go?</title><link>https://appliedgo.net/spotlight/optimize-by-porting-to-go/</link><pubDate>Sun, 09 Mar 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/optimize-by-porting-to-go/</guid><description>'We ported this app to Go and see a 200% performance increase!' Just by porting the app line by line to Go? Probably not.</description></item><item><title>A Delve Debugger Cheatsheet</title><link>https://appliedgo.net/spotlight/delve-cheat-sheet/</link><pubDate>Sun, 02 Mar 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/delve-cheat-sheet/</guid><description>Debuggers tend to go overboard with features and subcommands. This Delve cheatsheet lists the most important commands that cover 90% of all use cases.</description></item><item><title>Killing Me Softly, Or: How Goroutines Want To Exit</title><link>https://appliedgo.net/spotlight/how-goroutines-want-to-exit/</link><pubDate>Sun, 16 Feb 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/how-goroutines-want-to-exit/</guid><description>POSIX threads have an array of control functions, goroutines have none. When to exit is a goroutine's decision. Here's how to properly stop them from the outside.</description></item><item><title>Avoid Anonymous Types</title><link>https://appliedgo.net/spotlight/avoid-anonymous-types/</link><pubDate>Sun, 09 Feb 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/avoid-anonymous-types/</guid><description>Anonymous types may seem like a suitable shortcut for simple scenarios, but the drawbacks don't outweigh the (perceived) benefits.</description></item><item><title>A New Error Handling Syntax</title><link>https://appliedgo.net/spotlight/error/</link><pubDate>Sun, 02 Feb 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/error/</guid><description>A proposed new syntax for error checking promises clearer code, but the syntax may lead to carelessly letting context-free errors bubble up the chain.</description></item><item><title>Weak Pointers</title><link>https://appliedgo.net/spotlight/weak-pointers/</link><pubDate>Sun, 26 Jan 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/weak-pointers/</guid><description>I would have called them modest pointers. They are unobtrusive and don't leave any garbage behind.</description></item><item><title>BART, The Little Routing Table Package That Became Indispensable</title><link>https://appliedgo.net/spotlight/bart-routing-table/</link><pubDate>Mon, 20 Jan 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/bart-routing-table/</guid><description>How a routing table implementation that the author wrote for in-house use became a sought-after package for networking apps.</description></item><item><title>Big Things Will Happen</title><link>https://appliedgo.net/spotlight/big-things-will-happen-2025/</link><pubDate>Sun, 12 Jan 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/big-things-will-happen-2025/</guid><description>You might feel powerless in the face of recent and upcoming disruptions. Think twice: Your Go skills are your secret weapon.</description></item><item><title>Distributing a Man Page With Goreleaser And Homebrew</title><link>https://appliedgo.net/spotlight/install-with-manpage/</link><pubDate>Thu, 19 Dec 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/install-with-manpage/</guid><description>Go CLI tools should come with a man page. Here is how to distribute a man page with Goreleaser and homebrew</description></item><item><title>Does your CLI tool have a man page?</title><link>https://appliedgo.net/spotlight/manpage/</link><pubDate>Thu, 12 Dec 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/manpage/</guid><description>RTFM! But what if the CLI tool has no man page? Make your users happy by providing a manpage alongside your CLI app.</description></item><item><title>Property Testing: Beyond Matching Input-Output Pairs</title><link>https://appliedgo.net/spotlight/property-testing/</link><pubDate>Sun, 01 Dec 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/property-testing/</guid><description>How to test properties of a function call that hold true for any input</description></item><item><title>Just Make a Task (Make vs. Taskfile vs. Just)</title><link>https://appliedgo.net/spotlight/just-make-a-task/</link><pubDate>Thu, 28 Nov 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/just-make-a-task/</guid><description>Make, Taskfile, Just, or something else? How build tools manage dependencies to avoid unnecessary work.</description></item><item><title>When (not) to call package-level APIs</title><link>https://appliedgo.net/spotlight/package-level-api/</link><pubDate>Thu, 21 Nov 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/package-level-api/</guid><description>Package level APIs are convenient, but they aren't concurrency safe. Here is how and when to use them.</description></item><item><title>Conventions in Go (a refresher)</title><link>https://appliedgo.net/spotlight/conventions-in-go/</link><pubDate>Tue, 12 Nov 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/conventions-in-go/</guid><description>Good conventions make reading, sharing, and talking about code much easier.</description></item><item><title>Developing Software With First Principles Thinking</title><link>https://appliedgo.net/spotlight/first-principles-thinking/</link><pubDate>Tue, 05 Nov 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/first-principles-thinking/</guid><description>Learning how the world works keeps you from having to blindly</description></item><item><title>MethodByName Inflates Your Binary Size</title><link>https://appliedgo.net/spotlight/reflection-binary-size/</link><pubDate>Fri, 25 Oct 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/reflection-binary-size/</guid><description>Four methods in Go's reflect package can block dead code elimination and thus increase binary size.</description></item><item><title>Ai In Programming: Blessing Or Curse?</title><link>https://appliedgo.net/spotlight/ai-in-programming/</link><pubDate>Sun, 20 Oct 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/ai-in-programming/</guid><description>My conclusions from using an open-soruce AI coding assistant (Continue) in VSCodium</description></item><item><title>Go is...? (Beyond Paradigms)</title><link>https://appliedgo.net/spotlight/beyond-paradigms/</link><pubDate>Fri, 11 Oct 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/beyond-paradigms/</guid><description>Paradigms are too coarse-grained to accurately describe a language. It is better to examine the language's features and the domains in which it is used.</description></item><item><title>Go for real-time applications</title><link>https://appliedgo.net/spotlight/realtime/</link><pubDate>Thu, 10 Oct 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/realtime/</guid><description>Garbage-collected languages aren't suitable for real-time apps? They are, for most flavors of 'real time'.</description></item><item><title>CUE: Your next configuration languaage?</title><link>https://appliedgo.net/spotlight/cue/</link><pubDate>Sun, 22 Sep 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/cue/</guid><description>Standard configuration languages lack type safety and verifiability. CUE is a validation language that is perfect for replacing YAML or JSON.</description></item><item><title>How to break up circular dependencies</title><link>https://appliedgo.net/spotlight/circular-dependencies/</link><pubDate>Sun, 15 Sep 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/circular-dependencies/</guid><description>Import dependencies in Go must contain no circles. Here is how to get rid of them</description></item><item><title>How to use errors with iterator functions in Go</title><link>https://appliedgo.net/spotlight/function-iterator-errors/</link><pubDate>Sun, 08 Sep 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/function-iterator-errors/</guid><description>The new function iterators in Go 1.23 have no means for returning an error. But what if the iterator function may fail?</description></item><item><title>How To Set Up Subcommands Without a CLI Command Package in 2 Steps</title><link>https://appliedgo.net/spotlight/subcommands-without-command-package/</link><pubDate>Sun, 01 Sep 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/subcommands-without-command-package/</guid><description>Which CLI command package to choose? Postpone this decision and use a build tool instead</description></item><item><title>Magic, or the lack thereof</title><link>https://appliedgo.net/spotlight/magic/</link><pubDate>Sun, 25 Aug 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/magic/</guid><description>Go is a non-magical language. The term 'non-magical' deserves a closer look.</description></item><item><title>It's time to switch! 5 ways of using the switch statement</title><link>https://appliedgo.net/spotlight/switch/</link><pubDate>Sun, 18 Aug 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/switch/</guid><description>Go's `switch` statement is more flexible that you might know.</description></item><item><title>4 tools for generating REST APIs</title><link>https://appliedgo.net/spotlight/4-tools-for-generating-rest-apis/</link><pubDate>Fri, 09 Aug 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/4-tools-for-generating-rest-apis/</guid><description>Generate Go code from an OpenAPI spec, or vice versa? You decide. These tools help you go both ways.</description></item><item><title>Removal Of Response Headers For Errors Can Break On-The-Fly Encoding in Go 1.23</title><link>https://appliedgo.net/spotlight/content-encoding/</link><pubDate>Sun, 04 Aug 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/content-encoding/</guid><description>In Go 1.23, ServeContent, ServeFile, and ServeFileFS remove the Content-Encoding header, affecting middleware that applies on-the-fly encoding.</description></item><item><title>Error Response Headers Removal Can Break on the Fly Encoding Go 123</title><link>https://appliedgo.net/spotlight/error-response-headers-removal-can-break-on-the-fly-encoding-go-123/</link><pubDate>Fri, 02 Aug 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/error-response-headers-removal-can-break-on-the-fly-encoding-go-123/</guid><description/></item><item><title>Range-Over-Func In A Nutshell</title><link>https://appliedgo.net/spotlight/range-over-func/</link><pubDate>Sun, 28 Jul 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/range-over-func/</guid><description>The new iterator functions in Go 1.23 replace an unwieldy loop construct with the familiar range syntax. Here is how.</description></item><item><title>6 repos that help you get better in Go</title><link>https://appliedgo.net/spotlight/6-repos-that-help-you-get-better-in-go/</link><pubDate>Sun, 07 Jul 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/6-repos-that-help-you-get-better-in-go/</guid><description>What's better than learning by inspecting real code? These repositories can help you transition from 'I know Go' to 'I understand how to use Go'.</description></item><item><title>Concurrency and pointers</title><link>https://appliedgo.net/spotlight/concurrency-and-pointers/</link><pubDate>Fri, 05 Jul 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/concurrency-and-pointers/</guid><description>Passing values through channels is fine, but beware of passing (hidden) pointers between goroutines.</description></item><item><title>Don't check in go.work</title><link>https://appliedgo.net/spotlight/dont-check-in-gowork/</link><pubDate>Thu, 27 Jun 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/dont-check-in-gowork/</guid><description>The go.work file manages local redirects of remote modules. It's specific to your machine, so don't add it to the repository.</description></item><item><title>How to Rename a Public Module in Go</title><link>https://appliedgo.net/spotlight/rename-a-public-module/</link><pubDate>Fri, 21 Jun 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/rename-a-public-module/</guid><description>Renaming a public module breaks all client code. Give your clients time to move over.</description></item><item><title>GNU Style Flags—Almost</title><link>https://appliedgo.net/spotlight/gnu-style-flags-almost/</link><pubDate>Fri, 14 Jun 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/gnu-style-flags-almost/</guid><description>To have GNU-style short and long flags, you don't have to reach out to third-party packages. Go's flag package can handle double-dash, long-name flags.</description></item><item><title>A demo-friendly web server</title><link>https://appliedgo.net/spotlight/a-demo-friendly-web-server/</link><pubDate>Mon, 03 Jun 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/a-demo-friendly-web-server/</guid><description>Or: don't hard-code your demo server port to 8080. Let it choose the next available port instead.</description></item><item><title>Domains for local dev servers</title><link>https://appliedgo.net/spotlight/domains-for-local-dev-servers/</link><pubDate>Sat, 01 Jun 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/domains-for-local-dev-servers/</guid><description>Instead of accessing your local dev servers through different port numbers, use Caddy to access them through separate domains.</description></item><item><title>3 Go anti-patterns</title><link>https://appliedgo.net/spotlight/3-go-anti-patterns/</link><pubDate>Sat, 11 May 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/3-go-anti-patterns/</guid><description>Don't do this or you must go to bed without committing your code.</description></item><item><title>Efficient tools with Go and unikernels</title><link>https://appliedgo.net/spotlight/efficient-tools-with-go-and-unikernels/</link><pubDate>Thu, 25 Apr 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/efficient-tools-with-go-and-unikernels/</guid><description>Unikernels can boot up rapidly and scale to zero to save energy and cost. A great basis for building efficient web-based tools.</description></item><item><title>Run Go apps securely and efficiently with Unikraft</title><link>https://appliedgo.net/spotlight/run-go-apps-securely-and-efficiently-with-unikraft/</link><pubDate>Fri, 19 Apr 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/run-go-apps-securely-and-efficiently-with-unikraft/</guid><description>Get the security of VMs with the lightness of containers: How unikernels meet both demands</description></item><item><title>Did you know...? Go has a Diamond Problem!</title><link>https://appliedgo.net/spotlight/diamond-problem/</link><pubDate>Fri, 05 Apr 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/diamond-problem/</guid><description>In a diamond-shaped class hierarchy, methods can be ambiguous. Go has no class hierarchies, but struct embedding can cause a similar problem.</description></item><item><title>Unpopular opinion: Go time format strings are not so bad after all</title><link>https://appliedgo.net/spotlight/time-format-strings/</link><pubDate>Sat, 16 Mar 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/time-format-strings/</guid><description>Go has an unconventional way of specifing time format. While time format strings can be confusing to construct, they are dead easy to read.</description></item><item><title>Containers from scratch?</title><link>https://appliedgo.net/spotlight/containers-from-scratch/</link><pubDate>Fri, 08 Mar 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/containers-from-scratch/</guid><description>Containers manage binaries and their supporting libs. Pure Go binaries don't need any external libs. Is the `scratch` image the right choice?</description></item><item><title>JSON Lines</title><link>https://appliedgo.net/spotlight/json-lines/</link><pubDate>Tue, 27 Feb 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/json-lines/</guid><description>This happens when JSON and CSV have a baby. (And how your Go code can benefit from it.)</description></item><item><title>How to get build information of a Go binary</title><link>https://appliedgo.net/spotlight/get-build-information-of-a-go-binary/</link><pubDate>Fri, 02 Feb 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/get-build-information-of-a-go-binary/</guid><description>A Go binary contains intersting details about the build process, such as Go version, dependencies, or build flags.</description></item><item><title>Communicate by (not) sharing memory</title><link>https://appliedgo.net/spotlight/communicate-by-not-sharing-memory/</link><pubDate>Fri, 05 Jan 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/communicate-by-not-sharing-memory/</guid><description>Can multiple goroutines write to the same slice without any safeguard? Sure, they can, but is it a good idea?</description></item><item><title>How to trivially test interface values for nil</title><link>https://appliedgo.net/spotlight/trivially-test-interface-values-for-nil/</link><pubDate>Sat, 09 Dec 2023 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/trivially-test-interface-values-for-nil/</guid><description/></item><item><title>Don't Select the Default</title><link>https://appliedgo.net/spotlight/dont-select-the-default/</link><pubDate>Sat, 09 Dec 2023 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/dont-select-the-default/</guid><description>In a select block, don't be tempted to add a default case as a "fallback" or it might turn into a busy loop.</description></item><item><title>How to rename or relocate a public Go module</title><link>https://appliedgo.net/spotlight/rename-or-relocate-a-public-go-module/</link><pubDate>Fri, 01 Dec 2023 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/rename-or-relocate-a-public-go-module/</guid><description/></item><item><title>Sum Types in Go</title><link>https://appliedgo.net/spotlight/sum-types-in-go/</link><pubDate>Tue, 21 Nov 2023 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/sum-types-in-go/</guid><description>Go has no native sum types. Does Go need them at all, given that it has multi-value returns, and is it possible to implement a custom sum type?</description></item><item><title>Dot Imports Ftw or Wtf</title><link>https://appliedgo.net/spotlight/dot-imports-ftw-or-wtf/</link><pubDate>Tue, 14 Nov 2023 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/dot-imports-ftw-or-wtf/</guid><description>At first sight, dot imports seem to make code clearer. However, in the end they only create more confusion than clarity.</description></item><item><title>Is []*T faster than []T?</title><link>https://appliedgo.net/spotlight/is-t-faster-than-t/</link><pubDate>Sat, 04 Nov 2023 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/is-t-faster-than-t/</guid><description>Is a slice of values faster than a slice of pointers? Does it even matter?</description></item><item><title>Immediately Invoked Function Expressions</title><link>https://appliedgo.net/spotlight/immediately-invoked-function-expressions/</link><pubDate>Fri, 20 Oct 2023 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/immediately-invoked-function-expressions/</guid><description>Define an anonymous function and invoke it right away: A pattern that is sometimes useful but hard to read and hence qualifies as 'clever, not clear'</description></item><item><title>Futures in Go</title><link>https://appliedgo.net/spotlight/futures-in-go/</link><pubDate>Sun, 17 Sep 2023 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/futures-in-go/</guid><description/></item><item><title>How To Verify Struct Initialization For Completeness</title><link>https://appliedgo.net/spotlight/verify-struct-initialization-complete/</link><pubDate>Sun, 10 Sep 2023 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spotlight/verify-struct-initialization-complete/</guid><description>Go doesn't enforce struct initialization to be complete. A linter helps to catch half-baked initialization.</description></item></channel></rss>