Edited by: Ben Cotton (@funnelfiasco)
2013 was a fantastic year for Go and system tools written in the language. Derek Collison, Founder & CEO of Apcera Inc, predicted in September 2012 that “Go will become the dominant language for systems work in IaaS, Orchestration, and PaaS in 24 months”. The release of the following projects, written in Go, should serve as proof that we are on track to see that happen:
- Docker (Pack, ship and run any application as a lightweight container)
- Packer (Automates the creation of any type of machine image)
- Etcd (Highly-available key value store for shared configuration and service discovery)
- SkyDNS (DNS service for service discovery)
- Heka (Data collection and processing made easy)
- Groupcache (Memcache replacement for caching and cache-filling)
- Simplicity
- Large Standard Library
- Statically Compiled Binaries
- Concurrency
Simplicity
Go only has 25 key words. There are no classes, exceptions, or inheritance, which keeps the language small and approachable. Go doesn’t force a particular paradigm. You can get a lot done in Go writing structured code, yet still end-up with an elegant solution.Lets review a short example to get a feel for the language:
// main.go
package main
import (
"log"
)
func main() {
log.Print("I'm using Go")
}
Every Go program starts with a main package.package main
Next we import the log package from the standard library:
import (
"log"
)
Finally we define the main entry point of the program. In the body of main we call the Print() function from the log package, which we use to log "I'm using Go" to the system console:
func main() {
log.Print("I'm using Go")
}
Unlike Ruby or Python, Go is a compiled language. We must compile our code before we can run it. You’ll find it refreshing to know Go makes the compilation process easy and fast. So fast that we can compile and run our code in a single step:go run main.go
2013/12/22 19:38:40 I'm using Go
This is great during development, but when you’re ready for deployment you’ll want to create a static binary:go build -o main main.go
./main
2013/12/22 19:38:40 I'm using Go
You can get a deeper dive into the language by taking A Tour of Go.Large Standard Library
Go ships with a large standard library containing just about everything you need for system administration out of the box:- command line flag processing
- interacting with the OS -- executing shell commands, reading and writing files, etc
- working with various encodings including JSON, CSV, XML, and base64
Concurrency
Often times the tools we build start out small. When it comes time to scale for performance we often need to turn to 3rd party frameworks or libraries. With Go you don’t have that problem. Concurrency is built-in, and not only that, it’s easy to use.Check out Rob Pike’s, one of the original authors of Go, excellent talk on Go concurrency patterns.
Statically-compiled Binaries
My favorite Go feature is the static binary. Running the go build command produces a self-contained binary which includes all package dependencies and the Go runtime. This means I don’t have to install Go on every target system or worry about conflicting dependencies at deploy time. This is by far the largest time saver I’ve come to appreciate when working with Go.There is, however, a catch. Since Go compiles to machine code you need to build binaries for each platform you want your code to run on. Linux binaries won't work on Windows. But just like everything else in Go, the process of building static binaries for other platforms is pretty straight forward. Go ships with all the bits necessary for cross-compiling your code, but you'll have to setup the proper toolchain first. Bootstrapping the environment for cross-compiling can be painful especially for people new to the process, but there are a few tools to help you automate the entire process:
goxc (build tool focused on cross-compiling and packaging)
gox (simple, no frills Go cross compile tool)
Once the toolchain is in place you can simply override the GOARCH and GOOS environment variables to cross-compile your code. For example, if you wanted to target Windows running on the 64 bit architecture run the following command:GOARCH="amd64" GOOS="windows" go build
For more details about building static binaries for other platforms checkout Dave Cheney’s Introduction to cross compilation with Go.
No comments:
Post a Comment