Skip to content


Linus Gasser edited this page Feb 11, 2019 · 153 revisions

This page collects experience reports about problems with Go that might inform our design of solutions to those problems. These reports should focus on the problems: they should not focus on and need not propose solutions. To propose solutions, see the proposal process.

We hope to use these experience reports to understand where people are having trouble writing Go, to help us prioritize future changes to the Go ecosystem. (We do not promise to reply to these. If you need immediate help answering questions about Go, see for resources.)

The best experience reports tell: (1) what you wanted to do, (2) what you actually did, and (3) why that wasn’t great, illustrating those by real concrete examples, ideally from production use. Please write these reports about the problems most significant to you, post them on your own blog, or on Medium, or as a Github Gist (use a .md extension for Markdown), or as a publicly-readable Google doc, and then link them here. (Talk videos or slides are also welcome, although they are not as convenient for us to digest.)

If you do not have permission to edit the wiki to add an article to this list, please file an issue.

Please keep the overall page sorted alphabetically by section (Error Handling before Logging, and so on). Within a section, please keep articles sorted chronologically. It's helpful to include a one-phrase summary of the point of each article.

Add new sections as appropriate.

Table of Contents

App and Game Development






Diagnostics and Debugging

  • Kevin Burke, "How I'm running benchmarks and printing their results", it would be nice if I didn't need so much Unix glue to run and print these. July 2017.

  • John Clarke, Tracking down an intermittent fault (not a race) by running a very slow {hit test failure, increase logging} cycle by running "do { go test -race } while ( $LASTEXITCODE -eq 0 )" overnight. Over many nights. Execution trace functionality like would be transformative. November 2018.

Education and Teaching

  • Carl Kingsford and Phillip Compeau, "Go 2.0 for Teaching". Experience using Go in an introductory programming course.


Error Handling

(This section is about writing if err != nil.)

Error Values

(This section is about additional error semantics beyond the Error() string method.)

File System



  • Vijay, "[Nested structs and slices not supported in gomobile]"


Inter Process Communication

Large-Scale Software Development


Misc / Multiple


  • Paul Jolly - "Creating a submodule within an existing module" - covers multi-module repos, cyclic module dependencies and the steps required to move between various "states"
  • Sam Whited -"Mod file format" - complaint about reinventing the serialization format wheel for mod files.
  • Chi authors - Github comment - comment on why the Chi authors won't implement Go Modules support yet (due to the import compatibility rule).
  • Sam Whited -"Supporting Go Modules" - Things learned from upgrading 20 so modules. TL;DR — upgrading large modules past v1 is a huge pain and needs tooling, failure modes for modules are very complex and it's easy to screw up adding modules support to existing projects.
  • Stripe Github thread (linked comment down) - reverting support for Go Modules. TL;DR — Stripe is reverting Go Modules support because there is no clear upgrade path from dep for modules above v1.
  • Referencing bash scripts in GOPATH


  • Kevin Burke, "Real Life Go Benchmarking," trying to explain to the average developer how to use tools like pprof, maybe this could be easier. July 2016.
  • Nathan Kerr, "Concurrency Slower?", shows how to use Go's testing, benchmarking, and profiling tools to improve the performance of a concurrent implementation of a function. April 2017.


  • Shannon Pekary, "Why GOPP," an attempt to create a 'class' keyword that simply makes a struct to also be an interface to make porting code from object-oriented languages much easier.





Type System

Typed nils


Clone this wiki locally
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.