Go for C++ developers

Francesc Campoy
Developer, Advocate, and Gopher at Google
@francesc
campoy@golang.org

#go4cpp

* Go for C++ developers

Agenda:

- let's talk about Go

- how do I do X in Go?

- concurrency, because it's awesome

- Q & A: but feel free to interrupt anytime

- We might not go through all the slides

* About me

*2011*  Joined Google as a Software Engineer

- writing mostly in C++ and Python
- used to think _smart_code_ was better than boring code

*2012* Joined the Go team as a Developer Programs Engineer

*2014*to*today* Developer Advocate for the Google Cloud Platform

* Let's talk about Go

* Go is

Go is

- open source

- statically typed

- object oriented (if you ask me)

- compiled

- memory safe

- type safe

* Why Go?

Go was created for:

- scalability

- concurrency

- simplicity

* Who uses Go?

Google:

- YouTube
- dl.google.com

Others:

- Docker
- SoundCloud
- Canonical
- CloudFlare
- Mozilla
- ...

[[http://golang.org/wiki/GoUsers][golang.org/wiki/GoUsers]]

* Who uses Go?

.image go4cpp/trends.png _ 800

.caption Google Trends for [[http://www.google.com/trends/explore#q=golang][golang]]

* Some Go features

* Go types

- primitive types

	int, uint, int8, uint8, ...
	bool, string
	float32, float64
	complex64, complex128

- structs

	struct {
		Name string
		Age  int
	}

- slices and arrays

	[]int, [3]string, []struct{ Name string }

- maps

	map[string]int

* Kinds of types (continued)

- pointers

	*int, *Person

- functions

	func(int, int) int

- channels

	chan bool

- interfaces

	interface {
		Start()
		Stop()
	}

* Type declarations

	type [name] [specification]

`Person` is a `struct` type.

	type Person struct {
		name string
		age  int
	}

`Celsius` is a `float64` type.

	type Celsius float64

* Function declarations

	func [name] ([params]) [return value]
	func [name] ([params]) ([return values])

A sum function:

	func sum(a int, b int) int {
		return a + b
	}

A function with multiple return values:

	func divMod(a, b int) (int, int) {
		return a / b, a % b
	}

Made clearer by naming the return values:

	func divMod(den, div int) (quo, rem int) {
		return den / div, den % div
	}

* Method declarations

	func ([receiver]) [name] ([params]) ([return values])

A method on a struct:

	func (p Person) IsMinor() bool {
		return p.age < 18
	}

But also a method on a `float64`:

	func (c Celsius) Freezing() bool {
		return c <= 0
	}

_Constraint:_ Methods can be defined *only* on types declared in the same package.

	// This won't compile
	func (s string) Length() int { return len(s) }

* Declaring variables

Normal declaration:

    var text string = "hello"

You can omit types:

    var text = "hello"

And inside of functions:

    text := "hello"

Other types

    a := 0                             // int
    b := true                          // boolean
    f := 1.0                           // float64
    p := Person{"Francesc", "Campoy"}  // Person

* No implicit numeric conversion

Given types:

    type Celsius float64

    type Fahrenheit float64

And the variables:

    var freezing Fahrenheit = 32
    var boiling Celsius = 100

This code won't compile:

    sauna := (freezing + boiling) / 2

There's no implicit numeric conversion in Go.

* Pointers and memory allocation

* Pointers

Go has pointers:

    var p *int
    p = new(int)

But no pointer arithmetics:

    var p *int = &a[0]
    var q = p+2            // invalid

There's `new` but there's no `delete`.

Memory is garbaged collected after it's no longer accessible.

* Memory allocation

The compiler decides where to allocate based on escape analysis.

Using `new` doesn't imply using the heap:

`stack.go`:

    func get() int {
        n := new(int)
        return *n
    }

And not all values in the heap are created with `new`:

`heap.go`:

    func get() *int {
        n := 4
        return &n
    }

* Choosing what allocation you want

You can *not* decide where a value is allocated.

But you can see what kind of allocation is used:

    $ go tool 6g -m stack.go

    stack.go:3: can inline get
    stack.go:4: get new(int) does not escape

Compare to:

    $ go tool 6g -m heap.go

    heap.go:3: can inline get
    heap.go:4: moved to heap: n
    heap.go:5: &n escapes to heap

* RAII

_Resource_Acquisition_Is_Initialization_

Provides:

- encapsulation of acquisition and disposition of resources

- exception safe

An example:

    void write_to_file (const std::string & message) {
        // mutex to protect file access
        static std::mutex mutex;
     
        // lock mutex before accessing file
        // at the end of the scope unlock mutex
        std::lock_guard<std::mutex> lock(mutex);

        // mutual exclusion access section
        ...
    }

* RAII in Go: defer

The `defer` statement:

- schedules a function call at the end of the current function

- stacks all deferred calls - first in first out

    var m sync.Mutex

    func writeToFile(msg string) error {
        m.Lock()
        defer m.Unlock()

        // mutual exclusion access section
    }

* Garbage collection

Go is a garbage collected language

But it's easy to limit heap allocations

- many values are allocated on the stack

- object pools: [[sync.Pool][http://golang.org/pkg/sync/#Pool]]

- contiguous area of memory

.play go4cpp/sizes.go /type/,

* More about garbage collection

Trusted in production.

Brad Fitzpatrick's talk on migrating dl.google.com from C++ to Go:

- [[https://talks.golang.org/2013/oscon-dl.slide#1][dl.google.com: Powered by Go]]

Current state and road plan:

- [[http://golang.org/s/go14gc][golang.org/s/go14gc]]

* Inheritance vs Composition

* Inheritance vs Composition

- Inheritance breaks encapsulation

- Composition causes boilerplate to proxy all methods

Example:

    type Engine struct{}

    func (e Engine) Start() { ... }
    func (e Engine) Stop()  { ... }

We want `Car` to be able to `Start` and `Stop` too.

More detail in my talk [[http://talks.golang.org/2014/go4java.slide#32][Go for Javaneros]]

* Struct embedding

Composition + Proxy of selectors

.play go4cpp/embedding.go /type/,

* Struct embedding and the diamond problem

What if two embedded fields have the same type?

.play go4cpp/diamond.go /type/,

* Struct embedding

It looks like inheritance but _it_is_not_inheritance_.

It is composition.

Used to share implementations between different types.

What if want to share behavior instead?

* Interfaces

* Interfaces

An interface is a set of methods.

In Java (C++ doesn't have interfaces)

    interface Switch {
        void open();
        void close();
    }

In Go:

	type OpenCloser interface {
		Open()
		Close()
	}

* It's all about satisfaction

Java interfaces are satisfied *explicitly*.

C++ abstract classes need to be extended *explicitly*

Go interfaces are satisfied *implicitly*.

.image //upload.wikimedia.org/wikipedia/commons/thumb/2/29/Rolling_Stones_09.jpg/512px-Rolling_Stones_09.jpg _ 512

.caption Picture by Gorupdebesanez [[http://creativecommons.org/licenses/by-sa/3.0][CC-BY-SA-3.0]], via [[http://commons.wikimedia.org/wiki/File%3ARolling_Stones_09.jpg][Wikimedia Commons]]

* Go: implicit satisfaction

_If_a_type_defines_all_the_methods_of_an_interface,_the_type_satisfies_that_interface._

Benefits:

- fewer dependencies
- no type hierarchy
- organic composition

* Structural subtyping

Better than duck typing. Verified at compile time.

.image go4cpp/duck.jpg 500 500

* FuncDraw: an example on interfaces

.image go4cpp/funcdraw.png 500 700

* FuncDraw: package parser

Package `parse` provides a parser of strings into functions.

	func Parse(text string) (*Func, error) { ... }

`Func` is a struct type, with an `Eval` method.

	type Func struct { ... }

	func (p *Func) Eval(x float64) float64 { ... }

* FuncDraw: package draw

Package draw generates images given a function.

	func Draw(f *parser.Func) image.Image {
		for x := start; x < end; x += inc {
			y := f.Eval(x)
			...
		}
	}

`draw` depends on `parser`, which makes testing hard.

* Breaking dependencies

Let's use an interface instead

	type Evaluable interface {
		Eval(float64) float64
	}

	func Draw(f Evaluable) image.Image image.Image {
		for x := start; x < end; x += inc {
			y := f.Eval(x)
			...
		}
	}

* Advanced interfaces and composition

* Struct embedding of interfaces

Embedding an interface:

- more types can be used
- limits what is added to the embedding type

Given:

    type Person struct {
        First string
        Last  string
        Age   int
    }

`Employee` exposes the `Age` of `Person`

    type Employee struct {
        Person
    }

    e := Employee{Person{"John", "Doe", 49}}

* Choosing what to proxy

But we could hide it by choosing an interface:

    type Employee struct {
        Namer
    }

    type Namer interface {
        Name() string
    }

And we need to make `Person` satisfy `Namer`

    func (e Person) Name() string { return e.First + e.Last }

And the rest of the code still works:

    e := Employee{Person{"John", "Doe", 49}}

* Easy mocking of interfaces

Given this function:

.code go4cpp/mock.go /func/,/^}/

How would you test it?

* Easy mocking of interfaces

`net.Conn` is an interface defined in the `net` package of the standard library.

    type Conn interface {
        Read(b []byte) (n int, err error)
        Write(b []byte) (n int, err error)
        Close() error
        LocalAddr() Addr
        RemoteAddr() Addr
        SetDeadline(t time.Time) error
        SetReadDeadline(t time.Time) error
        SetWriteDeadline(t time.Time) error
    }

We need a fake `net.Conn`!

* One solution

We could define a new type that satisfies `net.Conn`

    type fakeConn struct {}

    func (c fakeConn) Read(b []byte) (n int, err error) {...}
    func (c fakeConn) Write(b []byte) (n int, err error) {...}
    func (c fakeConn) Close() error {...}
    ...

But, is there a better way?

* The better way

.code go4cpp/mock.go /type fakeConn/,/end_fake/

And our test can look like:

.play go4cpp/mock.go /func main/,

* Concurrency

* Concurrency

It is part of the language, not a library.

Based on three concepts:

- goroutines: lightweight threads
- channels: typed pipes used to communicate and synchronize between goroutines
- select: control structure to coordinate concurrent operations

.image go4cpp/funnelin.jpg 300 700

* Sleep and talk

.code go4cpp/conc1.go /sleepAndTalk/,/^}/

We want a message per second.

.play go4cpp/conc1.go /func main/,/^}/

What if we started all the `sleepAndTalk` concurrently?

Just add `go`!

* Concurrent sleep and talk

.play go4cpp/conc2.go /func main/,/^}/

That was fast ...

When the `main` goroutine ends, the program ends.

* Concurrent sleep and talk with more sleeping

.play go4cpp/conc3.go /func main/,/^}/

But synchronizing with `Sleep` is a bad idea.

* Communicating through channels

`sleepAndTalk` sends the string into the channel instead of printing it.

.code go4cpp/chan.go /sleepAndTalk/,/^}/

We create the channel and pass it to `sleepAndTalk`, then wait for the values to be sent.

.play go4cpp/chan.go /func main/,/^}/

* Aside: a web server

A production ready web server.

.play go4cpp/webserver.go

* Let's count on the web

Why is this wrong?

.play go4cpp/badcounter.go /nextID/,

* Let's count on the web correctly

We receive the next id from a channel.

.code go4cpp/goodcounter.go /nextID/,/^}/

We need to send ids into the channel.

.code go4cpp/goodcounter.go /counter/,/^}/

* Let's count on the web correctly

And we need to do both at the same time.

.play go4cpp/goodcounter.go /func main/,/^}/

* Let's fight!

`select` allows us to choose among multiple channel operations.

.play go4cpp/battle.go /battle/,/^}/

Go - [[http://localhost:8080/fight?usr=go]]
C++ - [[http://localhost:8080/fight?usr=cpp]]

* Chain of gophers

.image go4cpp/chain.jpg

Ok, I'm just bragging here

* Chain of gophers

.play go4cpp/goroutines.go /func f/,

* Concurrency is very powerful

And there's lots to learn!

- [[http://talks.golang.org/2012/concurrency.slide#1][Go Concurrency Patterns]], by Rob Pike
- [[http://talks.golang.org/2013/advconc.slide#1][Advanced Concurrency Patterns]], by Sameer Ajmani
- [[http://talks.golang.org/2012/waza.slide#1][Concurrency is not Parellelism]], by Rob Pike

.image go4cpp/busy.jpg

* In conclusion

- Go is simple, consistent, readable, and fun.

- All types are equal: methods on any type.

- Implicit satisfaction of interfaces makes code easier to reuse.

- Use composition instead of inheritance.

- Struct embedding is a powerful tool.

- Concurrency is awesome, and you should check it out.

* What to do next?

Learn Go on your browser with [[http://tour.golang.org][tour.golang.org]]

Find more about Go on [[http://golang.org][golang.org]]

Join the community at [[https://groups.google.com/forum/#!forum/Golang-nuts][golang-nuts]]

Link to the slides [[http://talks.golang.org/2015/go4cpp.slide]]
