You are on page 1of 18

Go (programming language)

From Wikipedia, the free encyclopedia

Go, also commonly referred to as golang, is a

Go

programming language developed at Google[7] in


2007 by Robert Griesemer, Rob Pike, and Ken
Thompson.[6] It is a statically-typed language with
syntax loosely derived from that of C, adding
garbage collection, type safety, some dynamic-typing
capabilities, additional built-in types such as
variable-length arrays and key-value maps, and a
large standard library.

Paradigm

compiled, concurrent, imperative,


structured

The language was announced in November 2009 and


is now used in some of Google's production

Designedby

systems.[8] Go's "gc" compiler targets the Linux, OS


X, FreeBSD, NetBSD, OpenBSD, Plan 9, DragonFly
BSD, Solaris, and Microsoft Windows operating
systems and the i386, amd64, ARM and IBM

Robert Griesemer
Rob Pike
Ken Thompson

Developer

Google Inc.

POWER processor architectures.[9] A second

Stable release

version 1.4.2[1] / 17February 2015

Typing
discipline

strong, static, inferred, structural

compiler, gccgo, is a GCC frontend.[10][11]


Android support was added in version 1.4, which
version has been ported to also run on iOS.[12]

Firstappeared 2009

Implementation C, Go, Asm


language
OS

Contents
1 History
2 Language design
2.1 Syntax
2.2 Types
2.2.1 Interface system
2.3 Package system
2.4 Concurrency: goroutines, channels,
and select
2.4.1 Suitability for parallel
programming
2.4.2 Lack of race condition
safety
2.5 Omissions
3 Conventions and code style
4 Language tools
5 Examples
5.1 Hello world
5.2 Echo
5.3 File Read
6 Notable users
7 Libraries
8 Community and conferences

Linux, OS X, FreeBSD, NetBSD,


OpenBSD,[2] MS Windows, Plan
9,[3] DragonFly BSD, Solaris

License

BSD-style[4] + Patent grant[5]

Filename
extensions

.go

Website

golang.org (https://golang.org)
Major implementations
gc (8g, 6g, 5g), gccgo
Influenced by

C, Python, occam, Limbo, Modula, Newsqueak,


Oberon, Pascal[6]

8 Community and conferences


9 Reception
10 Mascot
11 Naming dispute
12 See also
13 Notes
14 References
15 External links

History
Ken Thompson states that, initially, Go was purely an experimental project. Referring to himself along
with the other original authors of Go, he states:[13]
When the three of us [Thompson, Rob Pike, and Robert Griesemer] got started, it was pure
research. The three of us got together and decided that we hated C++. [laughter] ...
[Returning to Go,] we started off with the idea that all three of us had to be talked into every
feature in the language, so there was no extraneous garbage put into the language for any
reason..
Rob Pike, at a talk in San Francisco in 2012: [14]
Back around September 2007, I was doing some minor but central work on an enormous
Google C++ program, one you've all interacted with, and my compilations were taking
about 45 minutes on our huge distributed compile cluster. An announcement came around
that there was going to be a talk presented by a couple of Google employees serving on the
C++ standards committee. They were going to tell us what was coming in C++11. In the
span of an hour at that talk we heard about something like 35 new features that were being
planned. At this point I asked myself a question: Did the C++ committee really believe that
was wrong with C++ was that it didn't have enough features?
Robert Griesemer, at the GopherCon 2015: [15]
It was clear what was wrong with C++ - it was very complex, hard to understand, missing
concurrency support, didnt scale, and had really long build times. A common pattern at
Google was that someone would have an issue with C++. Theyd send out an email
soliciting advice; everyone would reply with a different answer. Finally, at the end of the
day, the C++ guru on the team (who wrote the book at the subject) would reply with a
definitive answer. This process was clearly broken.
The history of the language before its first release, back to 2007, is covered in the language's FAQ.[16]

Language design

Go is recognizably in the tradition of C, but makes many changes to improve conciseness, simplicity,
and safety. The following is a brief overview of the features which define Go:
A syntax and environment adopting patterns more common in dynamic languages:[17]
Concise variable declaration and initialization through type inference (x:= 0not int x =
0;).
Fast compilation times.[18]
Remote package management (go get)[19] and online package documentation.[20]
Distinctive approaches to particular problems:
Built-in concurrency primitives: light-weight processes (goroutines), channels, and the
selectstatement.
An interface system in place of virtual inheritance, and type embedding instead of nonvirtual inheritance.
A toolchain that, by default, produces statically linked native binaries without external
dependencies.
A desire to keep the language specification simple enough to hold in a programmer's head,[21] in
part by omitting features common to similar languages; see Omissions.
Frequent criticisms assert that:
lack of compile-time generics leads to repetition or excessive dynamic code[22][23]
lack of language extensibility (through, for instance, operator overloading) makes certain tasks
more verbose[24][22]
the type system's lack of constor Hindley-Milner typing inhibits safety and/or
expressiveness[25][26]
the pauses and overhead of garbage collection limit Go's use in systems programming compared to
languages with manual memory management[22][25]
The language designers argue that these trade-offs are important to Go's success,[27] and explain some
particular decisions at length,[28] though they do express openness to adding some form of generic
programming in the future, and to pragmatic improvements in areas like standardizing ways to apply
code generation[29] and reducing garbage collection pause times.[30]

Syntax
Go's syntax includes changes from C aimed at keeping code concise and readable. A combined
declaration/initialization operator was introduced that allows the programmer to write i:= 3or s:=
"some words", without specifying the types of variables. This contrasts with C's int i = 3;and
const char *s = "some words";. Semicolons still terminate statements, but are implicit when
they would occur at the end of a line. Functions may return multiple values, and returning a result,
is the conventional way a function indicates an error to its caller in Go.[a] Go adds literal
syntaxes for initializing struct parameters by name, and for initializing maps and slices. As an alternative
to C's three-statement forloop, Go's rangeexpressions allow concise iteration over arrays, slices,
strings, and maps.
errpair

Types

Go has a number of built-in types, including numeric ones (byte, int64, float32, etc.), booleans
and character strings (string). Strings are immutable; built-in operators and keywords (rather than
functions) provide concatenation, comparison, and UTF-8 encoding and decoding.[31] Record types can
be defined with the structkeyword.
For each type Tand each non-negative integer constant n, there is an array type denoted [n]T; arrays of
differing lengths are thus of different types. Dynamic arrays are available as "slices", denoted []Tfor
some type T. These have a length and a capacity specifying when new memory needs to be allocated to
expand the array. Several slices may share their underlying memory.[32][33][34]
Pointers are available for all types, and the pointer-to-Ttype is denoted *T. Pointer operations are
limited to indirection; there is no pointer arithmetic (except via the special unsafe.Pointertype
provided by the standard library).
For a pair of types K, V, the type map[K]Vis the type of hash tables mapping type-Kkeys to type-V
values. Hash tables are built into the language, with special syntax and built-in functions. Finally, chan
Tis a channel that allows sending values of type T between concurrently running processes; see
#Concurrency.
Aside from its support for interfaces, Go's type system is nominal: the typekeyword can be used to
define a new named type, which is distinct from all other types that have the same layout (in the case of
a struct, the same members in the same order). Some conversions between types (e.g., between the
various integer types) are pre-defined and adding a new type may define additional conversions, but
these must always be invoked explicitly.[35] For example, the typekeyword can be used to define a
type for IPv4 addresses, which are 32-bit unsigned integers:
type ipv4addr uint32

With this type definition, ipv4addr(x)interprets the uint32value xas an IP address. Simply
assigning xto a variable of type ipv4addris a type error.
Constant expressions may be either typed or "untyped"; they are given a type when assigned to a typed
variable, if the value they represent passes a compile-time check.[36]
Function types are indicated by the funckeyword; they take zero or more parameters and return zero or
more values, all of which are typed. The parameter and return values determine a function type; thus,
func(string, int32) (int, error)is the type of functions that take a stringand a 32-bit
signed integer, and return a signed integer (of default width) and a value of the built-in interface type
error.
Any named type has a method set associated with it. The IP address example above can be extended
with a method for converting an address to a human-readable representation, viz.,
// Is this the zero broadcast address 255.255.255.255?
func (addr ipv4addr) ZeroBroadcast() bool {
return addr == 0xFFFFFFFF
}

Due to nominal typing, this method definition adds a method to ipv4addr, but not on uint32. While
methods have special definition and call syntax, there is no distinct method type.[37]

Interface system
Go provides two features that replace class inheritance. The first is embedding, an automated form of
composition. The second are its interfaces.
An interface specifies a set of types by listing required methods: for example, implementing io.Reader
requires a Readmethod that takes a []byteand returns a count of bytes read and any error.[38] Any type
having such a method satisfies the interface implicitly, without the programmer having to specify in the
code that the type is a Reader. Code calling Readneedn't know whether it's reading from an HTTP
connection, a file, an in-memory buffer, or any other source.
Go's standard library defines interfaces for a number of concepts: input sources
(http://golang.org/pkg/io/#Reader) and output sinks, (http://golang.org/pkg/io/#Writer) sortable
collections, (http://golang.org/pkg/sort/#Interface) objects printable as strings,
(http://golang.org/pkg/fmt/#Stringer) hash functions (http://golang.org/pkg/hash/#Hash), and so on.
Go types don't declare which interfaces they implement: having the required methods is implementing
the interface. In formal language, Go's interface system provides structural rather than nominal typing.
The example below uses the io.Readerand io.Writerinterfaces to test Go's implementation of SHA256 on a standard test input, 1,000,000 repeats of the character "a". RepeatByteimplements an
io.Readeryielding an infinite stream of repeats of a byte, similar to Unix /dev/zero. The main()
function uses RepeatByteto stream a million repeats of "a" into the hash function, then prints the result,
which matches the expected value published online.[39] Even though both reader and writer interfaces
are needed to make this work, the code needn't mention either; the compiler infers what types implement
what interfaces:
package main
import (
"fmt"
"io"
"crypto/sha256"
)
type RepeatByte byte
func (r RepeatByte) Read(p []byte) (n int, err error) {
for i := range p {
p[i] = byte(r)
}
return len(p), nil
}
func main() {
testStream := RepeatByte('a')
hasher := sha256.New()
io.CopyN(hasher, testStream, 1000000)
fmt.Printf("%x", hasher.Sum(nil))
}

(Run or edit this example online. (http://play.golang.org/p/MIaP4AXV_G))


Also note type RepeatByteis defined as a byte, not a struct. Named types in Go needn't be structs,
and any named type can have methods defined, satisfy interfaces, and act, for practical purposes, as
objects; the standard library, for example, stores IP addresses in byte slices.[40]

Besides calling methods via interfaces, Go allows converting interface values to other types with a runtime type check. The language constructs to do so are the type assertion,[41] which checks against a
single potential type, and the type switch,[42] which checks against multiple types.
interface{}, the

empty interface, is an important corner case because it can refer to an item of any
concrete type, including builtin types like string. Code using the empty interface can't simply call
methods (or built-in operators) on the referred-to object, but it can store the interface{}value, try to
convert it to a more useful type via a type assertion or type switch, or inspect it with Go's reflect
package.[43] Because interface{}can refer to any value, it's a limited way to escape the restrictions of
static typing, like void*in C but with additional run-time type checks.
Interface values are implemented using pointer to data and a second pointer to run-time type
information.[44] Like some other types implemented using pointers in Go, interface values are nilif
uninitialized.[45] Unlike in environments like Java's virtual machine, there is no object header; the runtime type information is only attached to interface values. So, the system imposes no per-object memory
overhead for objects not accessed via interface, similar to C structs or C# ValueTypes.
Go does not have interface inheritance, but one interface type can embed another; then the embedding
interface requires all of the methods required by the embedded interface.[46]

Package system
In Go's package system, each package has a path (e.g., "compress/bzip2"or
"golang.org/x/net/html") and a name (e.g., bzip2or html). References to other packages' definitions
must always be prefixed with the other package's name, and only the capitalized names from other
modules are accessible: io.Readeris public but bzip2.readeris not.[47] The go getcommand can
retrieve packages stored in a remote repository such as Github or Google Code, and package paths often
look like partial URLs for compatibility.[48]

Concurrency: goroutines, channels, and select


Go provides facilities for writing concurrent programs that share state by communicating.[49][50][51]
Concurrency refers not only to multithreading and CPU parallelism, which Go supports, but also to
asynchrony: letting slow operations like a database or network-read run while the program does other
work, as is common in event-based servers.[52]
Go's concurrency-related syntax and types include:
The gostatement, go func(), starts a function in a new light-weight process, or goroutine
Channel types, chan type, provide type-safe, synchronized, optionally buffered channels between
goroutines, and are useful mostly with two other facilities:
The send statement, ch <- xsends xover ch
The receive operator, <- chreceives a value from ch
Both operations block until the channel is ready for communication
The selectstatement uses a switch-like syntax to wait for communication on any one out of a set
of possible channels, or tries non-blocking communication[53]

From these tools one can build concurrent constructs like worker pools, pipelines (in which, say, a file is
decompressed and parsed as it downloads), background calls with timeout, "fan-out" parallel calls to a
set of services, and others.[54] Channels have also found uses further from the usual notion of
interprocess communication, like serving as a concurrency-safe list of recycled buffers,[55]
implementing coroutines (which helped inspire the name goroutine),[56] and implementing iterators.[57]
While the communicating-processes model is favored in Go, it isn't the only one: memory can be shared
across goroutines (see below), and the standard syncmodule provides locks and other primitives.[58]
Suitability for parallel programming
Although Go's concurrency features are not aimed primarily at parallel processing,[52] they can be used
to program shared memory multi-processor machines. Various studies have been done into the
effectiveness of this approach.[59] One of these studies compared the size (in lines of code) and speed of
programs written by a seasoned programmer not familiar with the language and corrections to these
programs by a Go expert (from Google's development team), doing the same for Chapel, Cilk and Intel
TBB. The study found that the non-expert tended to write divide-and-conquer algorithms with one go
statement per recursion, while the expert wrote distribute-work-synchronize programs using one
goroutine per processor. The expert's programs were usually faster, but also longer.[60]
Lack of race condition safety
There are no restrictions on how goroutines access shared data, making race conditions possible.
Specifically, unless a program explicitly synchronizes via channels or other means, writes from one
goroutine might be partly, entirely, or not at all visible to another, often with no guarantees about
ordering of writes.[61] Furthermore, Go's internal data structures like interface values, slice headers, and
string headers are not immune to race conditions, so type and memory safety can be violated in
multithreaded programs that modify shared instances of those types without synchronization.[62][63]
Idiomatic Go minimizes sharing of data (and thus potential race conditions) by communicating over
channels, and a race-condition tester is included in the standard distribution to help catch unsafe
behavior. Still, it is important to realize that while Go provides building blocks that can be used to write
correct, comprehensible concurrent code, arbitrary code isn't guaranteed to be safe.
Some concurrency-related structural conventions of Go (channels and alternative channel inputs) are
derived from Tony Hoare's communicating sequential processes model. Unlike previous concurrent
programming languages such as occam or Limbo (a language on which Go co-designer Rob Pike
worked[64]), Go does not provide any built-in notion of safe or verifiable concurrency.[61]

Omissions
Go deliberately omits certain features common in other languages, including (implementation)
inheritance, generic programming, dynamic linking, assertions, pointer arithmetic and implicit type
conversions.
Of these language features, the Go authors express an openness to generic programming, explicitly argue
against assertions and pointer arithmetic, while defending the choice to omit type inheritance as giving a
more useful language, encouraging instead the use of interfaces to achieve dynamic dispatch[b] and

composition to reuse code. Composition and delegation are in fact largely automated by struct
embedding; according to researchers Schmager et al., this feature "has many of the drawbacks of
inheritance: it affects the public interface of objects, it is not fine-grained (i.e, no method-level control
over embedding), methods of embedded objects cannot be hidden, and it is static", making it "not
obvious" whether programmers will not overuse it to the extent that programmers in other languages are
reputed to overuse inheritance.[65]
Regarding generic programming, some built-in functions are in fact type-generic, but these are treated as
special cases; Rob Pike calls this a weakness of the language that may at some point be changed.[32] The
Google team that designs the language built at least one compiler for an experimental Go dialect with
generics, but didn't release it.[66]
After initially omitting exceptions, the exception-like panic/recovermechanism was eventually
added to the language, which the Go authors advise using for unrecoverable errors such as those that
should halt an entire program or server request, or as a shortcut to propagate errors up the stack within a
package (but not across package boundaries; there, error returns are the standard API).[67][68][69][70]

Conventions and code style


The Go authors and community put substantial effort into molding the style and design of Go programs:
Indentation, spacing, and other surface-level details of code are automatically standardized by the
go fmttool. golintdoes additional style checks automatically.
Tools and libraries distributed with Go suggest standard approaches to things like API
documentation (godoc[71]), testing (go test), building (go build), package management (go
get), and so on.
Syntax rules require things that are optional in other languages, for example by banning cyclic
dependencies, unused variables or imports, and implicit type conversions.
The omission of certain features (for example, functional-programming shortcuts like mapand
C++-style try/finallyblocks) tends to encourage a particular explicit, concrete, and imperative
programming style.
Core developers write extensively about Go idioms, style, and philosophy, in the Effective Go
document (http://golang.org/doc/effective_go.html) and code review comments reference
(https://code.google.com/p/go-wiki/wiki/CodeReviewComments), presentations
(http://talks.golang.org/), blog posts (http://commandcenter.blogspot.com/2012/06/less-isexponentially-more.html), and public mailing list messages
(https://groups.google.com/d/msg/golang-dev/CGGiLKunggo/2z051XlQO1EJ).

Language tools
Go includes the same sort of debugging, testing, and code-vetting tools as many language distributions.
The Go distribution includes, among other tools,
go build, which

builds Go binaries using only information in the source files themselves, no


separate makefiles
go test, for unit testing and microbenchmarks
go fmt, for formatting code
go get, for retrieving and installing remote packages

go vet, a static analyzer looking for potential errors in code


go run, a shortcut for building and executing code
godoc, for displaying documentation or serving it via HTTP
gorename, for renaming variables, functions, and so on in a type-safe
go generate, a standard way to invoke code generators

way

It also includes profiling and debugging support, runtime instrumentation (to, for example, track garbage
collection pauses), and a race condition tester.
There is an ecosystem of third-party tools that add to the standard distribution, such as gocode, which
enables code autocompletion in many text editors, goimports(by a Go team member), which
automatically adds/removes package imports as needed, errcheck, which detects code that might
unintentionally ignore errors, and more. Plugins exist to add language support in widely used text
editors, and at least one IDE, LiteIDE, is branded as "a simple, open source, cross-platform Go IDE."[72]

Examples
Hello world
Here is a Hello world program in Go:
package main
import "fmt"
func main() {
fmt.Println("Hello, World")
}

(Run or edit this example online. (http://play.golang.org/p/6wn73kqMxi))

Echo
This imitates the Unix echo command in Go:[73]
package main
import (
"flag"
"fmt"
"strings"
)
func main() {
omitNewline := flag.Bool("n", false, "don't print final newline")
flag.Parse() // Scans the arg list and sets up flags.
str := strings.Join(flag.Args(), " ")
if *omitNewline {
fmt.Print(str)
} else {
fmt.Println(str)
}
}

File Read

// Reading and writing files are basic tasks needed for


// many Go programs. First we'll look at some examples of
// reading files.
package main
import (
"bufio"
"fmt"
"io"
"io/ioutil"
"os"
)
// Reading files requires checking most calls for errors.
// This helper will streamline our error checks below.
func check(e error) {
if e != nil {
panic(e)
}
}
func main() {
// Perhaps the most basic file reading task is
// slurping a file's entire contents into memory.
dat, err := ioutil.ReadFile("/tmp/dat")
check(err)
fmt.Print(string(dat))
// You'll often want more control over how and what
// parts of a file are read. For these tasks, start
// by `Open`ing a file to obtain an `os.File` value.
f, err := os.Open("/tmp/dat")
check(err)
// Read some bytes from the beginning of the file.
// Allow up to 5 to be read but also note how many
// actually were read.
b1 := make([]byte, 5)
n1, err := f.Read(b1)
check(err)
fmt.Printf("%d bytes: %s\n", n1, string(b1))
// You can also `Seek` to a known location in the file
// and `Read` from there.
o2, err := f.Seek(6, 0)
check(err)
b2 := make([]byte, 2)
n2, err := f.Read(b2)
check(err)
fmt.Printf("%d bytes @ %d: %s\n", n2, o2, string(b2))
// The `io` package provides some functions that may
// be helpful for file reading. For example, reads
// like the ones above can be more robustly
// implemented with `ReadAtLeast`.
o3, err := f.Seek(6, 0)
check(err)
b3 := make([]byte, 2)
n3, err := io.ReadAtLeast(f, b3, 2)
check(err)
fmt.Printf("%d bytes @ %d: %s\n", n3, o3, string(b3))
// There is no built-in rewind, but `Seek(0, 0)`
// accomplishes this.
_, err = f.Seek(0, 0)
check(err)
// The `bufio` package implements a buffered
// reader that may be useful both for its efficiency
// with many small reads and because of the additional
// reading methods it provides.
r4 := bufio.NewReader(f)

b4, err := r4.Peek(5)


check(err)
fmt.Printf("5 bytes: %s\n", string(b4))
// Close the file when you're done (usually this would
// be scheduled immediately after `Open`ing with
// `defer`).
f.Close()
}

[74][75]

Notable users
Some notable open-source applications in Go include:
Docker, a set of tools for deploying Linux containers
Doozer (http://xph.us/2011/04/13/introducing-doozer.html), a lock service by managed hosting
provider Heroku
Flynn (https://github.com/flynn), a PaaS powered by Docker
Gogs (Go Git Service) (https://github.com/gogits/gogs), a self-hosted Git service
Juju, a service orchestration tool by Canonical, packagers of Ubuntu Linux
nsq (https://github.com/bitly/nsq), a message queue by bit.ly
Syncthing, an open-source file synchronization client/server application
Packer (https://www.packer.io), a tool for creating identical machine images for multiple
platforms from a single source configuration
Other companies and sites using Go (generally together with other languages, not exclusively)
include:[76][77]
Google, for many projects, notably including download server dl.google.com[78][79][80]
Dropbox, migrated some of their critical components from Python to Go[81]
CloudFlare, for their delta-coding proxy Railgun (https://www.cloudflare.com/railgun), their
distributed DNS service, as well as tools for cryptography, logging, stream processing, and
accessing SPDY sites.[82][83]
SoundCloud, for "dozens of systems"[84]
The BBC, in some games and internal projects
Novartis, for an internal inventory system
Splice, for the entire backend (API and parsers) of their online music collaboration platform.[85]
Cloud Foundry, a platform as a service
CoreOS, a Linux-based operating system that utilizes Docker containers
MongoDB, tools for administrating MongoDB instances
Zerodha, for realtime peering and streaming of market data
Chango, a programmatic advertising company uses Go in its real-time bidding systems.[86]
SendGrid, a Boulder, Colorado-based transactional email delivery and management service.[87]
Plug.dj, an interactive online social music streaming website.[88]

Libraries
Go's open-source libraries include:

Go's standard library (http://golang.org/pkg), which covers a lot of fundamental functionality:


Algorithms: compression, cryptography, sorting, math, indexing, and text and string
manipulation.
External interfaces: I/O, network clients and servers, parsing and writing common formats,
running system calls, and interacting with C code.
Development tools: reflection, runtime control, debugging, profiling, unit testing,
synchronization, and parsing Go.
Third-party libraries with more specialized tools:
Web toolkits, including the Gorilla Web Toolkit (http://www.gorillatoolkit.org/), Revel
(http://revel.github.io/), goweb (https://github.com/stretchr/goweb), rst
(https://github.com/mohamedattahri/rst) and beego (https://github.com/astaxie/beego)
Database, stream, and caching tools, including groupcache
(https://github.com/golang/groupcache) and kv (https://github.com/cznic/kv) and ql
(https://github.com/cznic/ql)
Parsers for common formats, such as HTML (https://code.google.com/p/go.net/html), JSON
(https://github.com/bitly/go-simplejson), and Google Protocol Buffers
(https://code.google.com/p/goprotobuf/)
Protocol implementations, such as ssh (https://code.google.com/p/go.crypto/ssh), SPDY
(https://github.com/amahi/spdy), and websocket
(https://code.google.com/p/go.net/websocket)
Database drivers, such as sqlite3 (https://code.google.com/p/go-sqlite/), mysql
(https://github.com/go-sql-driver/mysql), and redis (https://github.com/garyburd/redigo/)
Bindings to C libraries, such as cgzip
(https://github.com/youtube/vitess/tree/master/go/cgzip), qml
(https://github.com/niemeyer/qml), and GTK (https://github.com/mattn/go-gtk)
Specialized tools like biogo (https://code.google.com/p/biogo/) for bioinformatics, meeus
(https://github.com/soniakeys/meeus) for astronomy, and gogeos
(http://paulsmith.github.io/gogeos/) for GIS
Some sites help index the libraries outside the Go distribution:
godoc.org (https://godoc.org/)
The Go Wiki's project page (https://code.google.com/p/go-wiki/wiki/Projects)

Community and conferences


Gopher Academy (http://gopheracademy.com/), Gopher Academy is a group of developers
working to educate and promote the golang community.
Golangprojects.com (http://golangprojects.com/), lists programming jobs and projects where
companies are looking for people that know Go
GopherCon (http://www.gophercon.com/) The first Go conference. Denver, Colorado, USA April
2426, 2014
dotGo (http://www.dotgo.eu/) European conference. Paris, France November 9, 2015
GopherConIndia (http://www.gophercon.in/) The first Go conference in India. Bangalore Feb. 1921 2015
Gopher Gala (http://www.gophergala.com) The first Golang hackathon. Jan 23 - 25 2015.
GolangUK (http://www.golanguk.com/) The first Golang conference in UK. London 21st Aug
2015

Reception
Go's initial release led to much discussion.

The interface system, and the deliberate omission of inheritance, were praised by Michele Simionato,
who likened these language characteristics to those of Standard ML, calling it "a shame that no popular
language has followed [this] particular route in the design space".[89]
Dave Astels at Engine Yard wrote:[90]
Go is extremely easy to dive into. There are a minimal number of fundamental language
concepts and the syntax is clean and designed to be clear and unambiguous. Go is still
experimental and still a little rough around the edges.
Ars Technica interviewed Rob Pike, one of the authors of Go, and asked why a new language was
needed. He replied that:[91]
It wasn't enough to just add features to existing programming languages, because sometimes
you can get more in the long run by taking things away. They wanted to start from scratch
and rethink everything. ... [But they did not want] to deviate too much from what developers
already knew because they wanted to avoid alienating Go's target audience.
Go was named Programming Language of the Year by the TIOBE Programming Community Index in
its first year, 2009, for having a larger 12-month increase in popularity (in only 2 months, after its
introduction in November) than any other language that year, and reached 13th place by January
2010,[92] surpassing established languages like Pascal. As of June 2015, its ranking had dropped to
below 50th in the index, placing it lower than COBOL and Fortran.[93]
Regarding Go, Bruce Eckel has stated:[94]
The complexity of C++ (even more complexity has been added in the new C++), and the
resulting impact on productivity, is no longer justified. All the hoops that the C++
programmer had to jump through in order to use a C-compatible language make no sense
anymore -- they're just a waste of time and effort. Now, Go makes much more sense for the
class of problems that C++ was originally intended to solve.
A 2011 evaluation of the language and its gcimplementation in comparison to C++ (GCC), Java and
Scala by a Google engineer found that
Go offers interesting language features, which also allow for a concise and standardized
notation. The compilers for this language are still immature, which reflects in both
performance and binary sizes.
R. Hundt[95]
The evaluation got a rebuttal from the Go development team. Ian Lance Taylor, who had improved the
Go code for Hundt's paper, had not been aware of the intention to publish his code, and says that his
version was "never intended to be an example of idiomatic or efficient Go"; Russ Cox then did optimize

the Go code, as well as the C++ code, and got the Go code to run slightly faster than C++ and more than
an order of magnitude faster than the "optimized" code in the paper.[96]

Mascot
Go's mascot is a gopher designed by Rene French, who also designed Glenda, the Plan 9 Bunny. The
mascot is based on one French had previously drawn for a WFMU fundraiser T-shirt.[97] The logo and
mascot are licensed under Creative Commons Attribution 3.0 license.[98]

Naming dispute
On the day of the general release of the language, Francis McCabe, developer of the Go! programming
language (note the exclamation point), requested a name change of Google's language to prevent
confusion with his language.[99] The issue was closed by a Google developer on 12 October 2010 with
the custom status "Unfortunate" and with the following comment: "there are many computing products
and services named Go. In the 11 months since our release, there has been minimal confusion of the two
languages."[100]

See also
Comparison of programming languages
Dart, another Google programming language

Notes
a. Usually, exactly one of the result and error values has a value other than the type's zero value; sometimes
both do, as when a read or write can only be partially completed, and sometimes neither, as when a read
returns 0 bytes. See Semipredicate problem: Multivalued return.
b. Questions "How do I get dynamic dispatch of methods?" and and "Why is there no type inheritance?" in the
language FAQ.[6]

References
1. "Release History - The Go Programming Language" (https://golang.org/doc/devel/release.html). Retrieved
17 January 2015.
2. "lang/go: go-1.4 Go programming language" (http://ports.su/lang/go). OpenBSD ports. 2014-12-23.
Retrieved 2015-01-19.
3. "Go Porting Efforts" (http://go-lang.cat-v.org/os-ports). Go Language Resources. cat-v. 12 January 2010.
Retrieved 18 January 2010.
4. "Text file LICENSE" (http://golang.org/LICENSE). The Go Programming Language. Google. Retrieved
5 October 2012.
5. "Additional IP Rights Grant" (http://code.google.com/p/go/source/browse/PATENTS). The Go Programming
Language. Google. Retrieved 5 October 2012.
6. "Language Design FAQ" (http://golang.org/doc/go_faq.html). golang.org. 16 January 2010. Retrieved
27 February 2010.
7. Kincaid, Jason (10 November 2009). "Googles Go: A New Programming Language Thats Python Meets
C++" (http://www.techcrunch.com/2009/11/10/google-go-language/). TechCrunch. Retrieved 18 January
2010.
8. "Go FAQ: Is Google using Go internally?" (http://golang.org/doc/faq#Is_Google_using_go_internally).
Retrieved 9 March 2013.

Retrieved 9 March 2013.


9. "Installing Go" (http://golang.org/doc/install.html#tmp_33). golang.org. The Go Authors. 11 June 2010.
Retrieved 11 June 2010.
10. "FAQ: Implementation" (http://golang.org/doc/go_faq.html#Implementation). golang.org. 16 January 2010.
Retrieved 18 January 2010.
11. "Installing GCC: Configuration" (http://gcc.gnu.org/install/configure.html). Retrieved 3 December 2011.
"Ada, Go and Objective-C++ are not default languages"
12. https://groups.google.com/forum/#!topic/golang-nuts/mmB2q8RqB-Y
13. Andrew Binstock (18 May 2011). "Dr. Dobb's: Interview with Ken Thompson"
(http://www.drdobbs.com/open-source/interview-with-ken-thompson/229502480). Retrieved 7 February
2014.
14. "Less is exponentially moree" (http://commandcenter.blogspot.mx/2012/06/less-is-exponentially-more.html).
15. "The Evolution of Go" (https://sourcegraph.com/blog/live/gophercon2015/123645585015).
16. "Frequently Asked Questions (FAQ) - The Go Programming Language" (http://golang.org/doc/faq#history).
Golang.org. Retrieved 2014-03-27.
17. Pike, Rob. "The Go Programming Language" (http://www.youtube.com/watch?
v=rKnDgT73v8s&feature=related). YouTube. Retrieved 1 Jul 2011.
18. Rob Pike (10 November 2009). The Go Programming Language (http://www.youtube.com/watch?
v=rKnDgT73v8s#t=8m53) (flv) (Tech talk). Google. Event occurs at 8:53.
19. Download and install packages and dependencies - go - The Go Programming Language
(http://golang.org/cmd/go/#hdr-Download_and_install_packages_and_dependencies); see godoc.org
(http://godoc.org) for addresses and documentation of some packages
20. "GoDoc" (http://godoc.org). godoc.org.
21. Rob Pike, on The Changelog (http://5by5.tv/changelog/100) podcast
22. Will Yager, Why Go is not Good (http://yager.io/programming/go.html)
23. Egon Elbre, Summary of Go Generics discussions
(https://docs.google.com/document/d/1vrAy9gMpMoS3uaVphB32uVXX4pi-HnNjkMEgyAHX4N4/edit#)
24. Danny Gratzer, Leaving Go (http://jozefg.bitbucket.org/posts/2013-08-23-leaving-go.html)
25. Jared Forsyth, Rust vs. Go (http://jaredly.github.io/2014/03/22/rust-vs-go/)
26. Janos Dobronszki, Everyday Hassles in Go (http://crufter.com/2014/12/01/everyday-hassles-in-go/)
27. Rob Pike, Less is exponentially more (http://commandcenter.blogspot.de/2012/06/less-is-exponentiallymore.html)
28. The Go Authors, Frequently Asked Questions (FAQ) (http://golang.org/doc/faq)
29. Rob Pike, Generating code (https://blog.golang.org/generate)
30. Richard Hudson, Go 1.4+ Garbage Collection (GC) Plan and Roadmap (http://golang.org/s/go14gc)
31. Rob Pike, Strings, bytes, runes and characters in Go (http://blog.golang.org/strings), 23 October 2013
32. Pike, Rob (26 September 2013). "Arrays, slices (and strings): The mechanics of 'append' "
(http://blog.golang.org/slices). The Go Blog. Retrieved 7 March 2015.
33. Andrew Gerrand, Go Slices: usage and internals (http://blog.golang.org/go-slices-usage-and-internals)
34. The Go Authors, Effective Go: Slices (http://golang.org/doc/effective_go.html#slices)
35. "The Go Programming Language Specification" (http://golang.org/ref/spec#Assignability). golang.org.
36. "The Go Programming Language Specification" (http://golang.org/ref/spec#Constants). golang.org.
37. "The Go Programming Language Specification" (http://golang.org/ref/spec#Calls). golang.org.
38. "io - The Go Programming Language" (http://golang.org/pkg/io/#Reader). golang.org.
39. SHA-256 test vectors (https://www.cosic.esat.kuleuven.be/nessie/testvectors/hash/sha/Sha-2256.unverified.test-vectors), set 1, vector #8
40. "src/net/ip.go - The Go Programming Language" (http://golang.org/src/pkg/net/ip.go). golang.org.
41. "The Go Programming Language Specification" (http://golang.org/ref/spec#Type_assertions). golang.org.
42. "The Go Programming Language Specification" (http://golang.org/ref/spec#Type_switches). golang.org.
43. reflect.ValueOf(i interface{}) (http://golang.org/pkg/reflect/#ValueOf) converts an interface{}to a
reflect.Valuethat can be further inspected
44. "Go Data Structures: Interfaces" (http://research.swtch.com/interfaces). Retrieved 15 November 2012.
45. "The Go Programming Language Specification" (http://golang.org/ref/spec#Interface_types). golang.org.
46. "Effective Go Interfaces and methods & Embedding"
(http://golang.org/doc/effective_go.html#interfaces_and_types). Google. Retrieved 28 November 2011.
47. "A Tutorial for the Go Programming Language" (http://golang.org/doc/go_tutorial.html). The Go
Programming Language. Google. Retrieved 10 March 2013. "In Go the rule about visibility of information is
simple: if a name (of a top-level type, function, method, constant or variable, or of a structure field or

48.
49.
50.
51.
52.
53.

54.
55.
56.
57.
58.
59.
60.

61.
62.
63.

64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.

method) is capitalized, users of the package may see it. Otherwise, the name and hence the thing being named
is visible only inside the package in which it is declared."
"go - The Go Programming Language" (http://golang.org/cmd/go/#hdrDownload_and_install_packages_and_dependencies). golang.org.
"Effective Go" (http://golang.org/doc/effective_go.html#sharing). golang.org.
Andrew Gerrand, Share memory by communicating (http://blog.golang.org/share-memory-bycommunicating)
Andrew Gerrand, Codewalk: Share memory by communicating (http://golang.org/doc/codewalk/sharemem/)
Rob Pike, Concurrency is not Parallelism (http://vimeo.com/49718712)
The Go Programming Language Specification (http://golang.org/ref/spec). This deliberately glosses over
some details in the spec: close, channel range expressions, the two-argument form of the receive operator,
unidrectional channel types, and so on.
"Go Concurrency Patterns" (http://talks.golang.org/2012/concurrency.slide). golang.org.
John Graham-Cumming, Recycling Memory Buffers in Go (http://blog.cloudflare.com/recycling-memorybuffers-in-go)
tree.go (http://golang.org/doc/play/tree.go)
Ewen Cheslack-Postava, Iterators in Go (http://ewencp.org/blog/golang-iterators/)
"sync - The Go Programming Language" (http://golang.org/pkg/sync/). golang.org.
Tang, Peiyi (2010). Multi-core parallel programming in Go (http://www.ualr.edu/pxtang/papers/acc10.pdf)
(PDF). Proc. First International Conference on Advanced Computing and Communications.
Nanz, Sebastian; West, Scott; Soares Da Silveira, Kaue. Examining the expert gap in parallel programming
(http://se.inf.ethz.ch/people/nanz/publications/nanz-et-al_europar13.pdf) (PDF). Euro-Par 2013. CiteSeerX:
10.1.1.368.6137 (http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.368.6137).
"The Go Memory Model" (http://golang.org/doc/go_mem.html). Google. Retrieved 5 January 2011.
Russ Cox, Off to the Races (http://research.swtch.com/gorace)
Rob Pike (October 25, 2012). "Go at Google: Language Design in the Service of Software Engineering"
(http://talks.golang.org/2012/splash.article). Google, Inc. "There is one important caveat: Go is not purely
memory safe in the presence of concurrency."
Brian W. Kernighan, A Descent Into Limbo (http://www.vitanuova.com/inferno/papers/descent.html)
Schmager, Frank; Cameron, Nicholas; Noble, James (2010). GoHotDraw: evaluating the Go programming
language with design patterns. Evaluation and Usability of Programming Languages and Tools. ACM.
"E2E: Erik Meijer and Robert Griesemer Going Go" (http://channel9.msdn.com/Blogs/Charles/ErikMeijer-and-Robert-Griesemer-Go). Channel 9. Microsoft. 7 May 2012.
Panic And Recover (https://code.google.com/p/go-wiki/wiki/PanicAndRecover), Go wiki
"Weekly Snapshot History" (http://golang.org/doc/devel/weekly.html#2010-03-30). golang.org.
"Proposal for an exception-like mechanism" (http://groups.google.com/group/golangnuts/browse_thread/thread/1ce5cd050bb973e4). golang-nuts. 25 March 2010. Retrieved 25 March 2010.
"Effective Go" (https://golang.org/doc/effective_go.html#panic). golang.org.
"Effective Go" (http://golang.org/doc/effective_go.html#commentary). golang.org.
LiteIDE (https://github.com/visualfc/liteide),
"A Tutorial for the Go Programming Language" (http://golang.org/doc/go_tutorial.html). golang.org. 16
January 2010. Retrieved 18 January 2010.
"Go by Example: Reading Files" (https://gobyexample.com/reading-files). gobyexample.com.
"os - The Go Programming Language" (http://golang.org/pkg/os/). golang.org.
Erik Unger, The Case For Go (https://gist.github.com/ungerik/3731476)
Andrew Gerrand, Four years of Go (http://blog.golang.org/4years), The Go Blog
"dl.google.com: Powered by Go" (http://talks.golang.org/2013/oscon-dl.slide). golang.org.
Matt Welsh, Rewriting a Large Production System in Go (http://matt-welsh.blogspot.com/2013/08/rewritinglarge-production-system-in-go.html)
David Symonds, High Performance Apps on Google App Engine
(http://talks.golang.org/2013/highperf.slide)
Patrick Lee, Open Sourcing Our Go Libraries (https://tech.dropbox.com/2014/07/open-sourcing-our-golibraries/), 7 July 2014.
John Graham-Cumming, Go at CloudFlare (http://blog.cloudflare.com/go-at-cloudflare)
John Graham-Cumming, What we've been doing with Go (http://blog.cloudflare.com/what-weve-been-doingwith-go)
Peter Bourgon, Go at SoundCloud (http://backstage.soundcloud.com/2012/07/go-at-soundcloud/)
"Go at Google I/O and Gopher SummerFest - The Go Blog" (http://blog.golang.org/io2014). golang.org.

85. "Go at Google I/O and Gopher SummerFest - The Go Blog" (http://blog.golang.org/io2014). golang.org.
86. "Chango" (http://github.com/chango/). GitHub.
87. Author: Tim Jenkins. "How to Convince Your Company to Go With Golang"
(https://sendgrid.com/blog/convince-company-go-golang/). SendGrid's Email Deliverability Blog.
88. Author: Steven Sacks. "Search & Advances" (https://tech.plug.dj/2015/06/09/search-advances/). plug.dj tech
blog.
89. Simionato, Michele (15 November 2009). "Interfaces vs Inheritance (or, watch out for Go!)"
(http://www.artima.com/weblogs/viewpost.jsp?thread=274019). artima. Retrieved 15 November 2009.
90. Astels, Dave (9 November 2009). "Ready, Set, Go!" (http://www.engineyard.com/blog/2009/ready-set-go/).
engineyard. Retrieved 9 November 2009.
91. Paul, Ryan (10 November 2009). "Go: new open source programming language from Google"
(http://arstechnica.com/open-source/news/2009/11/go-new-open-source-programming-language-fromgoogle.ars). Ars Technica. Retrieved 13 November 2009.
92. jt. "Google's Go Wins Programming Language Of The Year Award" (http://jaxenter.com/google-s-go-winsprogramming-language-of-the-year-award-10069.html). jaxenter. Retrieved 5 December 2012.
93. "TIOBE Programming Community Index for June 2015"
(http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html). TIOBE Software. June 2015. Retrieved
5 July 2015.
94. Bruce Eckel (27 August 2011). "Calling Go from Python via JSON-RPC"
(http://www.artima.com/weblogs/viewpost.jsp?thread=333589). Retrieved 29 August 2011.
95. Hundt, Robert (2011). Loop recognition in C++/Java/Go/Scala (https://days2011.scalalang.org/sites/days2011/files/ws3-1-Hundt.pdf) (PDF). Scala Days.
96. Metz, Cade (1 July 2011). "Google Go strikes back with C++ bake-off"
(http://www.theregister.co.uk/2011/07/01/go_v_cpluplus_redux/). The Register.
97. "Gopher" (https://blog.golang.org/gopher).
98. "FAQ The Go Programming Language" (http://golang.org/doc/faq#Whats_the_origin_of_the_mascot).
Golang.org. Retrieved 2013-06-25.
99. Claburn, Thomas (11 November 2009). "Google 'Go' Name Brings Accusations Of Evil' "
(http://www.informationweek.com/news/software/web_services/showArticle.jhtml?articleID=221601351).
InformationWeek. Retrieved 18 January 2010.
100. "Issue 9 - go I have already used the name for *MY* programming language"
(https://code.google.com/p/go/issues/detail?id=9). Google Code. Google Inc. Retrieved 12 October 2010.

External links
Official website (https://golang.org)
Wikimedia Commons has
A Tour of Go (https://tour.golang.org/) (official)
media related to Go
Go Programming Language Resources (http://go-lang.catprogramming language.
v.org/) (unofficial)
Pike, Rob (28 April 2010). "Another Go at Language Design"
(http://www.stanford.edu/class/ee380/Abstracts/100428.html). Stanford EE Computer Systems
Colloquium. Stanford University. (video (https://www.youtube.com/watch?v=7VcArS4Wpqk))
A university lecture
Retrieved from "https://en.wikipedia.org/w/index.php?
title=Go_(programming_language)&oldid=673112590"
Categories: C programming language family Concurrent programming languages Google software
Procedural programming languages Cross-platform software
Programming languages created in 2009 American inventions Software using the BSD license
Free compilers and interpreters Statically typed programming languages
This page was last modified on 26 July 2015, at 05:16.

Text is available under the Creative Commons Attribution-ShareAlike License; additional terms
may apply. By using this site, you agree to the Terms of Use and Privacy Policy. Wikipedia is a
registered trademark of the Wikimedia Foundation, Inc., a non-profit organization.

You might also like