Go Programming Language

Not to be confused with Go! (programming language), an agent-based language released in 2003.
Go
Paradigm(s) compiled, concurrent, imperative, structured
Appeared in 2009
Designed by Robert Griesemer
Rob Pike
Ken Thompson
Developer Google Inc.
Stable release version 1.1.2[1] (13 August 2013; 11 months ago (2013-08-13))
Typing discipline strong, static, inferred
Major implementations gc (8g, 6g, 5g), gccgo
Influenced by C, Limbo, Modula, Newsqueak, Oberon, Pascal,[2] Python
Implementation language C, Go
OS Linux, Mac OS X, FreeBSD, NetBSD, OpenBSD, MS Windows, Plan 9[3]
License BSD-style[4] + Patent grant[5]
Usual filename extensions .go
Website

Go, also called golang, is a programming language initially developed at Google[6] in 2007 by Robert Griesemer, Rob Pike, and Ken Thompson.[2] It is a statically-typed language with syntax loosely derived from that of C, adding automatic memory management, type safety, some dynamic-typing capabilities, additional built-in types such as variable-length arrays and key-value maps, and a large standard library. Beyond that broad category, Go is defined by:

The language was announced in November 2009 and is now used in some of Google's production systems.[13] Go's "gc" compiler targets the Linux, Mac OS X, FreeBSD, OpenBSD, Plan 9, and Microsoft Windows operating systems and the i386, amd64, and ARM processor architectures.[14] A second compiler, gccgo, is a GCC frontend.[15][16]

Syntax and package system

Go's syntax, while recognizably in the C family, makes many changes aimed at keeping code concise. The Go compiler infers the types of expressions, allowing just i := 3 or w := "some words" to replace C's int i = 3; or char* s = "some words";. Semicolons at the end of lines aren't required. Functions may return multiple, named values, and returning a result, err pair is the standard way to handle errors in Go. (The language does have an exception-like mechanism, panic/recover, but it's only meant for rare circumstances.[17][18][19]) As an alternative to C's three-statement for loop, Go's range expressions allow concise iteration over arrays, slices, strings, and maps. Go adds literal syntaxes for initializing struct parameters by name, and initializing maps and slices.

Go also adds syntax to support facilities that aren't in C, some of which are discussed in the Interfaces and Concurrency sections. The slice types have additional syntax, so that, for example, a[:3] refers to the first three items of array a. As in many newer C-influenced languages, anonymous functions can appear in expressions and close over any variables in the surrounding scope. Source code is UTF-8, names may include non-Latin letters,[20] and some Unicode support is built into the language through the rune type (which represents a Unicode code point) and range operator (which can iterate over code points in a UTF-8 string).[21]

Go has a standard style covering indentation, spacing, and many other details, usually applied to user code by the go fmt tool in the Go distribution. Go requires that programs not contain unused variables or imports or discard the results of evaluating certain built-in functions.[22] Banning unnecessary imports is particularly important because Go does not support circular dependencies.

There is much more to Go's syntax; for further reading, try Go's gobyexample.com.

In Go's package system, each package has a path (e.g., "compress/bzip2" or "code.google.com/p/go.net/html") and a name (e.g., bzip2 or 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.Reader is public but bzip2.reader is not.[23] The go get command can retrieve packages stored in a remote repository such as Github or Google Code.[24]

Go deliberately omits certain features common in other languages, including generic programming, assertions, pointer arithmetic, and inheritance. 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 heavy use of interfaces instead.[2]

Concurrency

Go provides facilities for writing concurrent programs that share state by communicating.[25][26][27] 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.[28]

Goroutines, channels, and select

Go's concurrency-related syntax and types include:

  • The go statement, go func(), starts a function in a new light-weight process, or goroutine
  • Channel types, chan type, provide a type-safe, synchronized, optionally buffered channels between goroutines, and are useful mostly with two other facilities:
    • The send statement, ch <- x sends x over ch
    • The receive operator, <- ch receives a value from ch
    • Both operations block until the other goroutine is ready to communicate
  • The select statement uses a switch-like syntax to wait for communication on any of a set of channels[29]

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.[30] Channels have also found uses further from the usual notion of interprocess communication, like serving as a concurrency-safe list of recycled buffers,[31] implementing coroutines (which helped inspire the name goroutine),[32] and implementing iterators.[33]

While communicating-processes model is the favored one in Go, it isn't the only one: memory can be shared across goroutines (see below), and the standard sync module provides locks and other primitives.[34]

Safety

There are no restrictions on how goroutines access shared data, making race conditions possible. Specifically, unless a program explicitly synchronizes via channels or mutexes, writes from one goroutine might be partly, entirely, or not at all visible to another, often with no guarantees about ordering of writes.[35] 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.[36][37]

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[38]), Go does not provide any built-in notion of safe or verifiable concurrency.[35]

Interface system

In place of virtual inheritance, Go uses interfaces. An interface declaration is nothing but a list of required methods: for example, implementing io.Reader requires a Read method that takes a []byte and returns a count of bytes read and any error.[39] Code calling Read needn'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: cryptographic hashes, and so on.

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

Go types don't declare which interfaces they implement: having the required methods is implementing the interface.

interface{}, the empty interface, is an important corner case because it can refer to an item of any concrete type, including primitive 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.[42] 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.

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.[43]

The example below uses the io.Reader and io.Writer interfaces to test Go's implementation of SHA-256 on a standard test input, 1,000,000 repeats of the character "a". RepeatByte implements an io.Reader yielding an infinite stream of repeats of a byte, similar to Unix /dev/zero. The main() function uses RepeatByte to stream a million repeats of "a" into the hash function, then prints the result, which matches the expected value published online.[44] 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))
}

(You can run or edit this example online.)

Note also that type RepeatByte is 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.[45]

Interface values are stored in memory as a pointer to data and a second pointer to run-time type information.[46] Like other pointers in Go, interface values are nil if uninitialized.[47] Unlike in environments like Java's virtual machine, there is no object header; the run-time 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.

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.)

Echo

This imitates the Unix echo command in Go:[48]

package main
 
import (
    "flag"
    "fmt"
    "strings"
)
 
func main() {
    var omitNewline bool
    flag.BoolVar(&omitNewline, "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)
    }
}

Projects and organizations using Go

Some notable applications in Go include:

  • Open-source applications (links go to source repositories)
    • vitess, a sharding MySQL proxy used by YouTube
    • Docker, a set of tools for deploying Linux containers
    • goread.io, an RSS reader
    • PaaS powered by Docker
  • Proprietary applications
    • dl.google.com, Google's server for large binary downloads like Chrome and Google Earth[49]

Large or noteworthy organizations that have used Go (typically as one of many languages, not exclusively) include:[51]

  • Google, for the dl.google.com Web server and YouTube's MySQL proxy
  • bit.ly, for their internal message queue, nsq
  • CloudFlare, for their delta-coding proxy, Railgun
  • Canonical, packagers of Ubuntu Linux, for the Juju service orchestration tool
  • Heroku, for their lock server, doozer
  • The BBC, in some games and internal projects
  • Novartis, for an internal inventory system
  • SoundCloud, for, among other things, build tools

Some organizations use Go for individual projects where concurrency or dependency-free deployment are particular concerns, while writing other projects in different languages.

For an index of many more libraries and apps in Go, see the Go Wiki's project page.

Reception

Go's initial release led to much discussion.

Michele Simionato wrote in an article for artima.com:[52]

Here I just wanted to point out the design choices about interfaces and inheritance. Such ideas are not new and it is a shame that no popular language has followed such particular route in the design space. I hope Go will become popular; if not, I hope such ideas will finally enter in a popular language, we are already 10 or 20 years too late :-(

Dave Astels at Engine Yard wrote:[53]

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:[54]

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,[55] surpassing established languages like Pascal. As of March 2013, it ranked 24th in the index.[56] Go is already in commercial use by several large organizations.[57]

Bruce Eckel stated:[58]

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.

Mascot

Go's mascot is a gopher designed by Renée French, who also designed Glenda, the Plan 9 Bunny. The logo and mascot are licensed under Creative Commons Attribution 3.0 license.[59]

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.[60] 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."[61]

See also

References

This article incorporates material from the official Go tutorial, which is licensed under the Creative Commons Attribution 3.0 license.

External links

  • A Tour of Go (official)
  • Go Programming Language Resources (unofficial)
  • (video) — A university lecture

This article was sourced from Creative Commons Attribution-ShareAlike License; additional terms may apply. World Heritage Encyclopedia content is assembled from numerous content providers, Open Access Publishing, and in compliance with The Fair Access to Science and Technology Research Act (FASTR), Wikimedia Foundation, Inc., Public Library of Science, The Encyclopedia of Life, Open Book Publishers (OBP), PubMed, U.S. National Library of Medicine, National Center for Biotechnology Information, U.S. National Library of Medicine, National Institutes of Health (NIH), U.S. Department of Health & Human Services, and USA.gov, which sources content from all federal, state, local, tribal, and territorial government publication portals (.gov, .mil, .edu). Funding for USA.gov and content contributors is made possible from the U.S. Congress, E-Government Act of 2002.
 
Crowd sourced content that is contributed to World Heritage Encyclopedia is peer reviewed and edited by our editorial staff to ensure quality scholarly research articles.
 
By using this site, you agree to the Terms of Use and Privacy Policy. World Heritage Encyclopedia™ is a registered trademark of the World Public Library Association, a non-profit organization.