Skip to content

ExperienceReports

Adrian Hesketh edited this page Jan 31, 2019 · 178 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 https://golang.org/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.

Education and Teaching

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

Documentation

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

Logging

Misc / Multiple

Modules

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

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

Clone this wiki locally