Some of my notes, thoughts, and observations after attending the excellent first GopherCon in Denver, Colorado, US.
A number of talks highlighted Gos Interfaces as something you should be using throughout your app. By separating data from behaviour, they help you write composable code. They are how you structure programs in Go.
12 Factor App
It’s not Go specific, but the Twelve-Factor App methodology came up a few times as they way people should be structuring and writing their apps. Go makes this easier, as you are always building single binarys, which is one of the principles of a twelve-factor app.
This is something I have also been looking at and would recommend you read the book (it’s a short read).
It’s also worth thinking about how you can use Docker (written in Go) to help create and deploy your apps.
There was a talk about Go Circuit, which allows processes (services) to talk to each other. I’m not completely certain on the details, but it sounds like services communicate by creating special files on the file system (under
/circuit). This provides language independence - each implementation just needs to understand the files. A separate process is then used to allow different services to communicate over the network.
One of the things that can catch people out when learning Go is the lack of exceptions. But there are two arguments made by the Go team as to why this is the case in Go:
- Error values should be just like any other value
- No hidden control flow (throw, try, catch, finally) improves readability
I don’t have a strong opinion either way. In Go, you might end up with more if/else statements, where as in Java you can have many catches. But by only having one way to deal with exceptions, you know exactly how a library will handle them, no matter who wrote the code, which is not the case in some other languages.
Some of the talks I would recommend watching when they are available:
- Hello Gophers - Opening day keynote. Looking back on why Go was successful. Interesting snippets on some of the design decisions that went in to Go. - slides | video
- Go Circuit - I need to watch again to try to understand it… - slides | video
- A Channel Compendium - Some clever ways to use channels. - slides
- Go for Sysadmins - Deploying Go apps. - slides | video
- Heka - Brief introduction to Heka, then explaining why they chose Go. - slides | video
- Go, from C to Go - The Go team are writing a tool to convert the Go compiler from C to Go. Interesting discussion on the challenges of rewriting source code and how they are addressing them. - slides
- NSQ - A message platform written in Go. Similar to AMQP, but with some interesting features. - slides
- Best Practices for Production Environments - Deploying Go at SoundCloud. - slides | article
- database/sql - Working with databases in Go. - slides
- Build Your Developer Tools in Go - Writing command line apps in Go. Covers solving some interesting problems including bundling asset files, terminal UI, auto updating.
- Building Web Services in Go - Also talks about interfaces and reflections in Go. - slides
- Go for gophers - Closing keynote. Using Gos features to write effective code. - slides
A list of some interesting (to me) projects that people discussed during the conference (in no order):
- Heka - Used to collect and process metrics. Something I have been looking at recently and will likely be using.
- Docker - The way we all of us will deploy apps in the near future.
- go-update - Automatically update your Go apps.
- go-qml - Cross platform applications written in Go, using Qt.
- Gobot - Robots (and more). Programmed with Go. Also wins the award for best live demo!
- Camlistore - Store all your data, privately.
- C-to-Go - A tool written by the Go team to convert the Go compiler from C to Go.
- Hugo - Fast and flexible static site generator. Looking at using it to render this site.
- Ramsgate - A multiplayer game server demoed by @ernestmicklei in the lightning talks.
- go-tigertonic - Framework for building JSON services.
- gh - GitHub client, which also drops down to Git for it’s commands.
- eventsource - Server-sent events.
- Bazil - File system that intelligently moves your data to where you want it.
- beego - Go webapp framework.
- termbox-go - CLI UI.
- mousetrap - Help Windows users with their command line apps.
- roshi - time-series event store.
- Martini - web framework.
- fsnotify - file system notifications.
- Deck - Scalable presentations.
- Disco - An alternative to Hadoop, built by Nokia1.
I was very impressed with the first GopherCon. It didn’t feel like the first; such was the organisation and professionalism. The talks were of a really high quality; including the lightning talks on the last day. I learnt a lot, and it’s going to take a while to sink in. Thanks again to everyone involved!