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)