title: ExperienceReports

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 https://go.dev/help/ 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

Casting

Concurrency

Context

Declarations

Dependencies

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 https://rr-project.org/ would be transformative. November 2018.

  • guanw, cmd/trace and PySnooper. Comparison of cmd/trace with a (more succinct) Python tracing API. May 2019.

Documentation

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

Generics

GoMobile

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

Immutability

Inter Process Communication

Large-Scale Software Development

Literals

Logging

Misc / Multiple

Modules

Performance

  • 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.

Porting

  • 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.

Slices

Syntax

Time

Tooling

Type System

Typed nils

Vendoring