You are on page 1of 33

Go for Pythonists

Aditya Mukerjee
(@chimeracoder)

Aditya Mukerjee
(@chimeracoder)

About the Author

Background: Server-side engineer/data


scientist

Professional work: ~50% Python (data work)

Began using Go in September

HackNY fellow (2011)

Currently Hacker-in-Residence at Quotidian


Ventures

Aditya Mukerjee
(@chimeracoder)

Python is awesome!

Aditya Mukerjee
(@chimeracoder)

Easy to read, even for non-Pythonistas


Only one (obvious) way to do it
Semi-standard style (PEP 8, etc.)
Dynamic typing => easy to prototype
Duck typing is awesome!
Relatively fast (vs. some interpreted languages)
Extensible (C extensions, etc.)
Docstrings => great documentation culture
Great library support
Great community

Aditya Mukerjee
(@chimeracoder)

Python can be not-so-awesome....

Aditya Mukerjee
(@chimeracoder)

Dynamic + strong typing = careless, fatal


errors:

eg. string concatenation with an integer literal

Slow (compared to C)
Migrating code between versions requires
work (ie, py3k)
Threading

Aditya Mukerjee
(@chimeracoder)

Go applies the Pythonic philosophy to a C-style


language
(http://talks.golang.org/2012/splash.article)

Aditya Mukerjee
(@chimeracoder)

Why Go?

Easy to read, even for non-Go programmers

Only one (obvious) way to do most things

Completely standard style

Very opinionated compiler

Catches lint + much more

Migrating code between versions requires no work ('go fix')

Static typing => easy to catch errors

Duck typing is still awesome!

Type inference => concise (unlike Java)

Godoc => similar to docstrings

Extensible (C extensions, etc.)

Good (growing) library support

Great community

Aditya Mukerjee
(@chimeracoder)

Basic Datatypes
Python

Go

int

int, int32, int64

float

float, float32 float64

tuple

array (mutable, fixed size)

list

Slice

bytes

[]byte

string

string

dictionary

maps (ie, map[string]int)

Aditya Mukerjee
(@chimeracoder)

Syntax

Fairly similar to C

However, types come after declarations

Yes, there are braces. I know, I know.

Aditya Mukerjee
(@chimeracoder)

Semicolons!

Unlike Javascript, truly optional

However, 'for' loops require same-line braces

Aditya Mukerjee
(@chimeracoder)

Declaration

Aditya Mukerjee
(@chimeracoder)

Zero values

By default, an uninitialized value carries the


'zero value' for that type
Encourages you to design your application in
such a way that the default values are
meaningful

Aditya Mukerjee
(@chimeracoder)

Zero values
Go

Zero value

int, int32, int64

float, float32 float64

0.0

Slice

nil

string

Pointer (any kind)

nil

maps

nil

Channel

nil

Aditya Mukerjee
(@chimeracoder)

Error handling

Explicit is better than implicit

Don't raise exceptions return errors

Advantages:

Errors are are very visible within the code

The compiler forces you to address them or ignore them


explicitly

Errors can contain arbitrary information (interface)

Disadvantages

A little weird to get used to (coming from Python)

Verbose

Aditya Mukerjee
(@chimeracoder)

Let the compiler be your guide

Aditya Mukerjee
(@chimeracoder)

Basic structures: if/for

Aditya Mukerjee
(@chimeracoder)

Structs

Similar to Python classes

No inheritance

Extra fields cannot be defined at runtime

Capitalized fields/methods are exported

Aditya Mukerjee
(@chimeracoder)

Initializing structs

Aditya Mukerjee
(@chimeracoder)

Methods

Methods appear outside the struct definition


Like Python, implicit parameter is really
explicit

Unlike Python, you generally don't use self

Automatically dereference pointers

Aditya Mukerjee
(@chimeracoder)

Interfaces

Duck typing: 'If it .look()s like a Duck and .quack()s like a duck, it's
a duck'
If any type provides the methods of an interface, it belongs to the
interface

The method name and signature (with return value) must match

Like Python, you simply use struct and it 'just works'.

Unlike Python, safety can be checked at compile-time

Remember: all methods are known at compile-time

Aditya Mukerjee
(@chimeracoder)

Aditya Mukerjee
(@chimeracoder)

Concurrency

Use goroutines/channels
'Don't communicate by sharing memory; share memory by
communicating'
Goroutines are lightweight, green threads which are
multiplexed onto multiple OS threads

If one blocks, the others still run

Very small memory footprint you can easily have hundreds of


thousands of goroutines running.

Advantage: Concurrent code looks very similar to nonconcurrent code

Compare to callbacks

Aditya Mukerjee
(@chimeracoder)

Using Channels: Generators

Aditya Mukerjee
(@chimeracoder)

Concurrency: Channels of channels

Channels are first-class values


Easy to implement rate-limiting for API calls,
etc.
The 'select' keyword lets you for any one of
several channels to stop blocking

Aditya Mukerjee
(@chimeracoder)

Package Management

Instead of virtualenv, Go has $GOPATH

Both do the same thing and in very similar ways

'go get' will fetch a remote package, compile


and install it

Aditya Mukerjee
(@chimeracoder)

Common Pitfalls for Pythonistas

Use slices, not arrays


Unexported (lowercase) fields are not
externally visible

Packages like encoding/json cannot view them

Execution ends when the main() function


terminates, even if other goroutines are
running

sync.WaitGroup is the solution to this

Aditya Mukerjee
(@chimeracoder)

Things I (sometimes) miss

List comprehensions

Generics

Not as necessary as you might think, but still helpful

NumPy/SciPy

Life without sugar

Scientific computation libraries are being developed, but


they are a work in progress

The GIL

Just kidding!

Aditya Mukerjee
(@chimeracoder)

Where to go from here?

Aditya Mukerjee
(@chimeracoder)

Community

'gofmt' makes all Go code standardized

Reading the source code is easy

#go-nuts

Go NYC Meetup

'Go for MongoDB @10Gen on Tuesday, March 12)

Aditya Mukerjee
(@chimeracoder)

Further Resources

The Go spec: http://golang.org/ref/spec

Effective Go

http://www.golang-book.com/ (Caleby Doxsey)

Writing Web Applications in Go:


http://golang.org/doc/articles/wiki/

Aditya Mukerjee
(@chimeracoder)

gojson

https://www.github.com/chimeracoder/gojson

Generate struct definitions for arbitrary JSON

Eliminates need for type assertions

If unmarshalling into a struct succeeds, you're


guaranteed to know what operations you can
perform on it

Aditya Mukerjee
(@chimeracoder)

Credits

All slides are licensed CC-BY-SA

'Go Gopher' courtesy of Rene French

Aditya Mukerjee
(@chimeracoder)