Distributed systems involve a diverse set of skills, and they themselves involve a very diverse set of concepts. Almost all of them do, however, have several concepts in common.
I'll briefly talk about 3 here:
- Concurrency
- Network communication
- Failure
Go has powerful concurrency featured built right into the language. Once you’ve learned the language (if you haven’t yet, I highly recommend the Tour of Go), I highly recommend you get familiar with the “big 3” concurrency features:
- Goroutines
- Channels
- The select statement
After you do, get familiar with some of the concurrency patterns around them:
- Timing out
- Recovering from failed Goroutines
- Fan-in/Fan-out
- Workers
- Request/Response
Once you’re familiar, you’ll have the conceptual tools to write efficient and correct concurrent programs that can deal with failures.
The last piece is network communication. You’ll probably have to communicate via HTTP, so I highly recommend looking at Go’s net/http library. Write a few simple programs that communicate with an HTTP API (the Github API is a great one to learn with), and a few others that implement an HTTP server (you could, for example, create your own HTTP API).
You’ll need both skill-sets to write distributed systems that communicate via HTTP. And, if you’re interested in going the “extra mile”, check out gRPC for more structured and efficient RPC-style network communication.
Finally, I am the creator of Go In 5 Minutes, and have quite a few screencasts that cover concurrency, HTTP and dealing with failure. I encourage you to check out the list of screencasts (all free) to sharpen your skills.