I've decided to learn Go. Not the board game, but the programming language. Why? I've been wanting to learn a systems programming language for a while, but have so far avoided picking up my brick of a C++ manual.
If Go can really replace C++ when writing e.g. a high performancee server (I don't know enough to say that yet), then that is good news! For starters I'm doing
It's a 71 step tutorial. Each step is a code editor and some text. Sometimes the text is an exercise, which is the case for step 35 (implement Pic). This is the picture I created there by the way (Go program listed at EOM):
Go is a fun language to learn. One thing I stumble upon here in the beginning is writing basic statements like loops and variable assignments in a new way. This is because the differences compared to Java, C and Python (the main language I know) are subtle. I find it a little annoying, but that is only because I suddenly can't remember how to write a for loop :-) However, new syntax should not obscure the killer features (in my book) of this newish language, namely that it is easy to write like Python, and has performance like C++. Well, it's in the ball park of those languages. Seems like the perfect combination!
There are many syntax things that I like. These are the things that make Go "easy to write like Python". One common thing in programming is to retrieve values from a map, when the key might be missing. This is how to do that in Go, which does away with huge constructions around map lookups (if (m.haskey()), try/excepts, ...):
An example of new syntax. Elegant key-lookups:
# Doing away with scaffolding around map key-loopups! Yay! # Because the key is missing, ok is False package main import "fmt" func main() { m := make(map[string]int) v, ok := m["Missing Key"] fmt.Println("The value:", v, "Present?", ok) # prints: The value: 0 Present? false } |
Solutions: "A Tour of Go" exercises
Spoiler alert!! I'm not claiming these to be particular elegant, so I'm just recorded them so that I may look at them in a future where I'm an expert Go programmer. In that future I can visit this page again and laugh at my feeble attempts.
page 35:
# My program to create and image as part of "A Tour of Go". package main import "code.google.com/p/go-tour/pic" func Pic(dx, dy int) [][]uint8 { pic := make([][]uint8, dy) for y := 0; y < dy; y++ { pic[y] = make([]uint8, dx) for x := 0; x < dx; x++ { pic[y][x] = uint8(x^y+(x+y)/2) } } return pic } func main() { pic.Show(Pic) } |
Page 40:
package main import ( "code.google.com/p/go-tour/wc" "strings" ) func WordCount(s string) map[string]int { wc := make(map[string]int) for _, word := range strings.Fields(s) { wc[word] += 1 } return wc } func main() { wc.Test(WordCount) } |
Page 43:
package main import "fmt" // fibonacci is a function that returns // a function that returns an int. func fibonacci() func() int { prev := 1 cur := 0 return func() int { res := prev + cur prev = cur cur = res return res } } func main() { f := fibonacci() for i := 0; i < 10; i++ { fmt.Println(f()) } } |