A Taste of Go
August 14, 2014

Robert Griesemer
Google
gri@golang.org


* The Go programming language

- Modern
# OO support but not type-oriented
# strong support for concurrency
- Compact, concise, general-purpose
- Imperative, statically type-checked, dynamically type-safe
- Garbage-collected
- Compiles to native code, statically linked
- Fast compilation, efficient execution

Designed by programmers for programmers!


* Hello, World!

.play taste/hello.go

# Unicode
# Programs are organized in packages
# A package is a set of package files
# A package file expresses its dependencies on other packages via import declarations
# The remainder of a package file is a list of (constant, variable, type, and function) declarations


* Hello, World! Internet-style

.play taste/hellohttp.go


* Program elements

* Constants

- Maintained precisely:
	const e = 2.71828182845904523536028747135266249775724709369995957496696763
	const third = 1/3
- Typed or without type:
	const M64 int64 = 1<<20
        const M = 1<<20
- Evaluated at compile-time:
	const big = 1<<100 / 1e30  // valid constant expression

Compiler complains if a constant doesn't fit where it is _used_.


* Variables

- Statically typed:
	var x int
	var s, t string
- Implicitly or explicitly initialized:
	var x int
	var s, t string = "foo", "bar"  // multiple assignment

	var x = 42                      // int
	var s, b = "foo", true          // string, bool
- Short variable declaration (inside functions only):
	x := 42
	s, b := "foo", true
- Can safely take address of _any_ variable!
	return &x
# compiler will do the right thing


* Types

- Predeclared types, the usual suspects:
	uint8 (byte), uint16, uint32, uint32, uint64,
	int8, int16, int32, int32 (rune), int64,
	float32, float64,
	complex64, complex128,
	uint, int, uintptr,
	bool, string,
	error  // not so usual

- Composite types:
	array, struct, pointer, function,
	slice, map, channel

- Abstract type:
	interface


* Type declarations

- Composition from left-to-right (Pascal style):
	[10]byte  // array of 10 bytes

	struct {
		name        string
		left, right *Node
		action      func(*Node)
	}

	func(a, b, c int)
	func(http.ResponseWriter, *http.Request) error

- A type declaration defines a _new_ type:
	type Weekday int

	type Point struct {
		x, y int
	}


* Slices

	[]T  // slice of T

- Descriptor for an underlying array segment
- May grow and shrink
- Has length and capacity
- Assigning a slice copies the descriptor, not the underlying array

Common slice operations:

	len(s)
	s[i]
	s[i:j]
	append(s, x)  // append element x to slice s and return new slice

- Slices play the role of dynamically sized arrays
- Widely used in Go code


* Maps

	map[K]V  // map K -> V

- Map is a language-supplied hash table
- Maps values of key type K to values of type V
- Assigning a map copies the map reference, not the map contents

Common map operations:

	make(map[K]V)
	len(m)
	m[k]
	delete(m, k)

- Map iteration order is not specified:

	for key, value := range m {
		// order of key sequence different each time
	}

* Statements

- Curly braces (C style)
- Multiple assignments and some other new constructs
- Many cleanups: mandatory braces, no parentheses for conditionals, implicit break in switches, no semicolons, etc.
	a, b = b, a                 // swap
	f, err = os.Open(filename)

	if x < y {
		return x
	} else {
		return y
	}

	switch day {
	case Mon:
		...
		// break is implicit
	case Tue, Wed:
		...
	}


* A few words on syntax

_Syntax_doesn't_matter_unless_you_are_a_programmer._
-- Rob Pike

Corollary:

_Compactness_of_syntax_doesn't_matter_unless_you_are_reading_programs._

Compact is not the same as terse. Readability is crucial.


* An example: IndexOfAny in Java

	public static int IndexOfAny(String str, char[] chars) {
		if (isEmpty(str) || ArrayUtils.isEmpty(chars)) {
			return -1;
		}
		for (int i = 0; i < str.length(); i++) {
			char ch = str.charAt(i);
			for (int j = 0; j < chars.length; j++) {
				if (chars[j] == ch) {
					return i;
				}
			}
		}
		return -1;
	}

299 chars (100%), 101 tokens (100%)


* IndexOfAny in Go

.code taste/examples.go /IndexOfAny START/,/IndexOfAny END/

217 chars (73%), 62 tokens (61%)

Almost 30% less text and a surprising 40% fewer tokens to read!

_Less_clutter_means_reduced_cognitive_load._

# minimum improvement
# typical Go programs tend to require much less than 70% of the code size of equivalent programs in other languages


* Functions

- Regular functions
	func Sin(x float64) float64
	func AddScale(x, y int, f float64) int

- Multiple return values
	func Write(data []byte) (written int, err error)

- Variadic parameter lists without magic
	func Printf(format string, args ...interface{})

- Functions are first-class values
	var delta int
	return func(x int) int { return x + delta }


* Function values: An example

	// walkStdLib calls f with the filename of each .go
	// file in the std library until f return false.
	func walkStdLib(f func(filename string) bool)

Calling walkStdLib with a closure:

.code taste/walk.go /example START/,/example END/

More directly:

.play taste/walk.go /main START/,/main END/


* Methods

Methods are functions with a _receiver_ parameter:

.code taste/point.go /String START/,/String END/

The receiver binds the method to its _base_type_ (Point):

.code taste/point.go /Point START/,/Point END/

Methods are invoked via the usual dot notation:

.play taste/point.go /main START/,/main END/


* Methods can be defined for any user-defined type!

For the Weekday type:

.code taste/weekday.go /type START/,/type END/

Define String method on Weekday:

.code taste/weekday.go /String START/,/String END/

.play taste/weekday.go /main START/,/main END/

Method calls via non-interface types are statically dispatched.

* Interface types

- Abstract
- Define (possibly empty) set of method signatures
- Values of _any_type_ that implement all methods of an interface can be assigned to a variable of that interface.

Examples:

	interface{}  // empty interface

	interface {
		String() string
	}

	interface {
		Len() int
		Swap(i, j int)
		Less(i, j int) bool
	}


* Using interfaces

.code taste/stringer.go /Stringer START/,/Stringer END/

Both Weekday and Point define a String method, so values of both can be assigned to
a variable of Stringer type:

.play taste/stringer.go /main START/,/main END/

Method calls via interface types are dynamically dispatched ("virtual function call").


* A larger example


* Top 10 identifiers in std library

.code taste/idents.go

	$ cat $(find $GOROOT -name '*.go') | ./idents | sort | uniq -c | sort -nr | sed 10q


* A variation: Histogram of Go statements

A histogram is a map from statement name ("if", "for", etc.) to use count:

.code taste/histo0.go /histogram START/,/histogram END/

Algorithm:

- Use walkStdLib to traverse all files of the std library
- For each file, parse and create abstract syntax tree
- Traverse syntax tree and add each statement to histogram
- Print the result

.code taste/histo0.go /main START/,/main END/


* Processing a Go source file

.code taste/histo0.go /add START/,/add END/


* Printing the histogram

.play taste/histo0.go /print START/,/print END/

Note: Histogram (map) iteration order is not specified.

* Sorting

sort.Sort operates on any type that implements the sort.Interface:

	interface {
		Len() int
		Swap(i, j int)
		Less(i, j int) bool
	}

For instance, to sort a slice of strings lexically, define:

.code taste/sort.go /lexical START/,/lexical END/

And sort:

	sort.Sort(lexical(s))  // where s is a []string slice


* Sorting histogram entries

.code taste/histo.go /byCount START/,/byCount END/


* Improved histogram printing

.play taste/histo.go /print START/,/print END/


* Concurrency

* Goroutines

- The _go_ statement launches a function call as a goroutine
	go f()
	go f(x, y, ...)

- A goroutine runs concurrently (but not necessarily in parallel)
- A goroutine has its own stack


* A simple example

.code taste/concurrency1.go /f START/,/f END/

Function f is launched as 3 different goroutines, all running concurrently:

.play taste/concurrency1.go /main START/,/main END/


* Communication via channels

A channel type specifies a channel value type (and possibly a communication direction):

	chan int
	chan<- string  // send-only channel
	<-chan T       // receive-only channel

A channel is a variable of channel type:

	var ch chan int
	ch := make(chan int)  // declare and initialize with newly made channel

A channel permits _sending_ and _receiving_ values:

	ch <- 1   // send value 1 on channel ch
	x = <-ch  // receive a value from channel ch (and assign to x)

Channel operations synchronize the communicating goroutines.

* Communicating goroutines

Each goroutine sends its results via channel ch:

.code taste/concurrency2.go /f START/,/f END/

The main goroutine receives (and prints) all results from the same channel:

.play taste/concurrency2.go /main START/,/main END/


* Putting it all together


* Analyze files concurrently, map-reduce style

Mapper:

.code taste/histop.go /mapper START/,/mapper END/

Reducer:

.code taste/histop.go /reducer START/,/reducer END/

.code taste/histop.go /merge START/,/merge END/


* From sequential program...

.play taste/histo.go /main START/,/main END/


* ... to concurrent program

.play taste/histop.go /main START/,/main END/


* There's a lot more!

- Extensive standard library

.link http://golang.org/pkg/

- Powerful tools

.link http://play.golang.org/p/Au02fFpYdf
# playground, gofmt

- Multi-platform support

.link http://build.golang.org/

- Great documentation

.link http://tour.golang.org/#1
