Go compiler intrinsics
Go allows authors to write functions in assembly if required. This is called a stub or forward declaration. package asm // Add returns the sum of a and b. func Add(a int64, b int64) int64 Here we’re...
View ArticleDon’t force allocations on the callers of your API
This is a post about performance. Most of the time when worrying about the performance of a piece of code the overwhelming advice should be (with apologies to Brendan Gregg) don’t worry about it, yet....
View ArticleBe wary of functions which take several parameters of the same type
APIs should be easy to use and hard to misuse.— Josh Bloch A good example of a simple looking, but hard to use correctly, API is one which takes two or more parameters of the same type. Let’s compare...
View ArticleUse internal packages to reduce your public API surface
In the beginning, before the go tool, before Go 1.0, the Go distribution stored the standard library in a subdirectory called pkg/ and the commands which built upon it in cmd/. This wasn’t so much a...
View ArticleInternets of interest: Warner Losh on the first ten years of UNIX
UNIX turns 50 this year which means 7th edition Research UNIX is that 40.
View ArticleInternets of interest #14: UNIX v0
Read more over at the Living Computer Museum’s restoration page.
View ArticleComplementary engineering indicators
Last year I had the opportunity to watch Cat Swetel’s presentation The Development Metrics You Should Use (but Don’t). The information that could be gleaned from just tracking the start and finish...
View ArticleInternets of Interest #15: The Queen of the Skies
If, like me, you’re a commercial aviation otaku, this walkthrough of an enthusiast built 747 cockpit simulator should be highly relevant to your interests.
View ArticleDynamically scoped variables in Go
This is a thought experiment in API design. It starts with the classic Go unit testing idiom: func TestOpenFile(t *testing.T) { f, err := os.Open("notfound") if err != nil { t.Fatal(err) } // ... }...
View ArticleThe Zen of Go
This article was derived from my GopherCon Israel 2020 presentation. It’s also quite long. If you’d prefer a shorter version, head over to the-zen-of-go.netlify.com. A recording of the presentation is...
View ArticleAre large slices more expensive than smaller ones?
Programmers have a tendency to be superstitious. Particularly, when a programmer hears that copies are expensive, they start to see them everywhere, especially when they learn that, in Go, every...
View Articlego test -v streaming output
The testing package is one of my favourite packages in the Go standard library, not just because of its low noise approach to unit testing, but, over the lifetime of Go, it has received a steady...
View ArticleInlining optimisations in Go
This is a post about how the Go compiler implements inlining and how this optimisation affects your Go code. n.b. This article focuses on gc, the de facto Go compiler from golang.org. The concepts...
View ArticleMid-stack inlining in Go
In the previous post I discussed how leaf inlining allows the Go compiler to reduce the overhead of function calls and extend optimisation opportunities across function boundaries. In this post I’ll...
View ArticleEnsmallening Go binaries by prohibiting comparisons
Conventional wisdom dictates that the larger the number of types declared in a Go program, the larger the resulting binary. Intuitively this makes sense, after all, what’s the point in defining a...
View ArticleFatih’s question
A few days ago Fatih posted this question on twitter. I’m going to attempt to give my answer, however to do that I need to apply some simplifications as my previous attempts to answer it involved a...
View ArticleDiamond interface composition in Go 1.14
Per the overlapping interfaces proposal, Go 1.14 now permits embedding of interfaces with overlapping method sets. This is a brief post explain what this change means: Let’s start with the definition...
View ArticleHow to dump the GOSSAFUNC graph for a method
The Go compiler’s SSA backend contains a facility to produce HTML debugging output of the compilation phases. This post covers how to print the SSA output for function and methods. Let’s start with a...
View ArticleThe story of the one line fix
Picture yourself, an engineer working at the hottest distributed microservices de jour, assigned to fix a bug. You jump into an unfamiliar codebase and quickly locate the line where the problem...
View ArticleA few bytes here, a few there, pretty soon you’re talking real memory
Today’s post comes from a recent Go pop quiz. Consider this benchmark fragment.1 func BenchmarkSortStrings(b *testing.B) { s := []string{"heart", "lungs", "brain", "kidneys", "pancreas"}...
View Article