First three sections are just stuff from the Go team itself.
Introductory/general
- https://tour.golang.org
- https://play.golang.org
- https://golang.org/ref/spec (much shorter and less formal than most language specs)
- https://golang.org/pkg/ (stdlib ref, also reachable via godoc.org, e.g. godoc.org/compress/gzip)
- https://talks.golang.org
- https://blog.golang.org
Workspaces and tools
- Workspace layout: https://golang.org/doc/code.html
- Tools:
- https://godoc.org/golang.org/x/tools/cmd/goimports -- like go fmt but fixes imports for you
- go vet -- catch some common mistakes
- -race -- race detector
- golang.org libs beyond the stdlib: https://github.com/golang/go/wiki/SubRepositories
How some things are represented in RAM, from Russ Cox:
- http://research.swtch.com/godata
- http://research.swtch.com/godata2
- http://research.swtch.com/interfaces
Style advice
Some random style observations (definitely not official--this is me opining)
- Style tends to be relatively concrete and imperative, lean a lot on basic ifaces like io.Reader/Writer.
- Sometimes folks try to imitate generics or functional-programming constructs, using reflect or something. The result tends to be painful and slow.
- I think intro materials tend to overemphasize channels, underemphasize package sync (and its Mutex, RWLock, WaitGroup, atomic ops, etc.). If you're thinking of your app as communicating actors (work queues, relaying events, etc.), channels are great. If not, use whatever fits most naturally.
Third-party stuff
- https://github.com/kisielk/errcheck checks for ignored errors
- https://github.com/gordonklaus/ineffassign generalizes the 'unused variable' check to 'unused assignment'
- https://github.com/alecthomas/gometalinter runs various linters
- If you use a fancy editor, look at vim-go or the Go plugins for it. LiteIDE is a simple Go-focused IDE.
- www.gorillatoolkit.org and go-kit.io are well-respected Web toolkits.
- github.com/{google,dropbox,facebookgo} are some sources of libraries from big cos. Google has protobuf and gRPC implementations for Go, for instance.
- godoc.org's super handy: github.com/facebookgo/grace docs are at https://godoc.org/github.com/facebookgo/grace for instance
Basic performance stuff
- https://blog.golang.org/profiling-go-programs
- Go 1.7 works with Linux's 'perf' tool
- There are different ways to see allocation and GC activity, some detailed at https://golang.org/pkg/runtime/
- GODEBUG=gctrace=1 prints GCs
- The -benchmem flag for tests tells you what a tet allocates
- runtime.MemStats lets you roll your own allocation counts
- https://golang.org/pkg/expvar/ exposes something like https://tip.golang.org/debug/vars
- As in some other contexts, an easy way to avoid allocation is to prefer streaming I/O and avoid unneeded copies like string<=>[]byte conversions. (Package bytes makes many string operations available for []byte data too.)
- sync.Pool is a standard package for "recycling" buffers and such, when you're confident they can safely be reused rather than wait for the GC to clean them up