+ + +
+ +
+
+
+

+ + Go (programming language) + +

+
+
+ From Wikipedia, the free encyclopedia +
+
+
+
+ Jump to: + + navigation + + , + + search + +
+
+
+ Not to be confused with + + Go! (programming language) + + , an agent-based language released in 2003. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Go +
+ + Golang.png + +
+ + Paradigm(s) + + + + compiled + + , + + concurrent + + , + + imperative + + , + + structured + +
+ + Designed by + + + + Robert Griesemer + +
+ + Rob Pike + +
+ + Ken Thompson + +
+ + Developer + + + + Google Inc. + +
+ Appeared in + + 2009 + + ; 5 years ago + + + ( + + 2009 + + ) + +
+ + Stable release + + + version 1.3.3 + + + + [ + + 1 + + ] + + + + / 1 October 2014 + + ; 39 days ago + + + ( + + 2014-10-01 + + ) + +
+ + Typing discipline + + + + strong + + , + + static + + , + + inferred + + , + + nominal + +
+ + Major implementations + + + gc (8g, 6g, 5g), gccgo +
+ Influenced by + + + C + + , + + occam + + , + + Limbo + + , + + Modula + + , + + Newsqueak + + , + + Oberon + + , + + Pascal + + , + + + + [ + + 2 + + ] + + + + + Python + + + [ + + + + citation needed + + + + ] + +
+ Implementation language + + + C + + , Go, + + Asm + +
+ + OS + + + + Linux + + , + + Mac OS X + + , + + FreeBSD + + , + + NetBSD + + , + + OpenBSD + + , + + MS Windows + + , + + Plan 9 + + + + + [ + + 3 + + ] + + + +
+ + License + + + + BSD + + -style + + + + [ + + 4 + + ] + + + + + Patent grant + + + + [ + + 5 + + ] + + + +
+ + Filename extension(s) + + + .go +
+ Website + + + + golang.org + + +
+

+ + Go + + , also commonly referred to as + + 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 + + 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. +

+

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

+

+

+
+
+

+ Contents +

+
+
    +
+
+

+

+

+ + History + + + + [ + + + edit + + + ] + + +

+

+ Ken Thompson states that, initially, Go was purely an experimental project. Referring to himself along with the other original authors of Go, he states: + + + + [ + + 11 + + ] + + + +

+
+

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

+
+

+ The history of the language before its first release, back to 2007, is covered in the language's FAQ. + + + + [ + + 12 + + ] + + + +

+

+ + Language design + + + + [ + + + edit + + + ] + + +

+

+ Go is recognizably in the tradition of C, but makes many changes aimed at conciseness, simplicity, and safety. The following is a brief overview of the features which define Go (for more information see the + + language specification + + ): +

+
    +
+

+ + Syntax + + + + [ + + + edit + + + ] + + +

+

+ Go's syntax includes changes from C aimed at keeping code concise and readable. The programmer needn't specify the types of expressions, allowing just + + i := 3 + + or + + s := "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 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 + + for + + loop, Go's + + range + + expressions allow concise iteration over arrays, slices, strings, and maps. +

+

+ + Types + + + + [ + + + edit + + + ] + + +

+

+ Go adds some basic types not present in C for safety and convenience: +

+
    +
+

+ Structurally, Go's type system has a few differences from C and most C derivatives. Unlike C + + typedef + + s, Go's named + + type + + s are not aliases for each other, and rules limit when different types can be assigned to each other without explicit conversion. + + + + [ + + 19 + + ] + + + + Unlike in C, conversions between number types are explicit; to ensure that doesn't create verbose conversion-heavy code, numeric constants in Go represent abstract, untyped numbers. + + + + [ + + 20 + + ] + + + + Finally, in place of non-virtual inheritance, Go has a feature called + + type embedding + + in which one object can contain others and pick up their methods. +

+

+ + Package system + + + + [ + + + edit + + + ] + + +

+

+ 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. + + + + [ + + 21 + + ] + + + + The + + go get + + command can retrieve packages stored in a remote repository such as Github or Google Code, and package paths often look like partial URLs for compatibility. + + + + [ + + 22 + + ] + + + +

+

+ + Concurrency: goroutines, channels, and + + select + + + + + [ + + + edit + + + ] + + +

+

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

+

+ Go's concurrency-related syntax and types include: +

+
    +
+

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

+

+ 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 + + sync + + module provides locks and other primitives. + + + + [ + + 32 + + ] + + + +

+

+ + Race condition safety + + + + [ + + + edit + + + ] + + +

+

+ 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. + + + + [ + + 33 + + ] + + + + 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. + + + + [ + + 34 + + ] + + + + + + + [ + + 35 + + ] + + + +

+

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

+

+ + Interface system + + + + [ + + + edit + + + ] + + +

+

+ 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. + + + + [ + + 37 + + ] + + + + 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: + + input sources + + and + + output sinks, + + + sortable collections, + + + objects printable as strings, + + + cryptographic hashes + + , 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.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. + + + + [ + + 38 + + ] + + + + 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. + + ) +

+

+ Also note + + type RepeatByte + + is defined as a + + byte + + , not a + + struct + + . Named types in Go needn't be + + struct + + s, 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. + + + + [ + + 39 + + ] + + + +

+

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

+

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

+

+ Interface values are stored in memory as a pointer to data and a second pointer to run-time type information. + + + + [ + + 43 + + ] + + + + Like other pointers in Go, interface values are + + nil + + if uninitialized. + + + + [ + + 44 + + ] + + + + 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 + + struct + + s or C# + + ValueType + + s. +

+

+ 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. + + + + [ + + 45 + + ] + + + +

+

+ + Omissions + + + + [ + + + edit + + + ] + + +

+

+ Go deliberately omits certain features common in other languages, including + + generic programming + + , assertions, pointer arithmetic, and inheritance. After initially omitting + + exceptions + + , the language added the + + panic + + / + + recover + + mechanism, but it is only meant for rare circumstances. + + + + [ + + 46 + + ] + + + + + + + [ + + 47 + + ] + + + + + + + [ + + 48 + + ] + + + +

+

+ 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 + + ] + + + +

+

+ + Conventions and code style + + + + [ + + + edit + + + ] + + +

+

+ The Go authors and community put substantial effort into molding the style and design of Go programs: +

+
    +
+

+ When adapting to the Go ecosystem after working in other languages, differences in style and approach can be as important as low-level language and library differences. +

+

+ + Language tools + + + + [ + + + edit + + + ] + + +

+

+ Go includes the same sort of debugging, testing, and code-vetting tools as many language distributions. The Go distribution includes + + go vet + + , which analyzes code searching for common stylistic problems and mistakes. A profiler, unit testing tool, + + gdb + + debugging support, and a race condition tester are also in the distribution. The Go distribution includes its own build system, which requires only information in the Go files themselves, no separate build files. +

+

+ 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 + + , targets Go in particular. +

+

+ + Examples + + + + [ + + + edit + + + ] + + +

+

+ + Hello world + + + + [ + + + edit + + + ] + + +

+

+ 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 + + + + [ + + + edit + + + ] + + +

+

+ This imitates the Unix + + echo command + + in Go: + + + + [ + + 50 + + ] + + + +

+
+
+
+        
+         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
+        
+         )
+        
+        
+         }
+        
+        
+         }
+        
+       
+
+
+

+ + File Read + + + + [ + + + edit + + + ] + + +

+
+
+
+        
+         // 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
+        
+        
+         ()
+        
+        
+         }
+        
+       
+
+
+

+ + + + [ + + 51 + + ] + + + + + + + [ + + 52 + + ] + + + +

+

+ + Notable users + + + + [ + + + edit + + + ] + + +

+

+ Some notable + + open-source + + applications in Go include: +

+
    +
+

+ Other companies and sites using Go (generally together with other languages, not exclusively) include: + + + + [ + + 53 + + ] + + + + + + + [ + + 54 + + ] + + + +

+
    +
+

+ + Libraries + + + + [ + + + edit + + + ] + + +

+

+ Go's open-source libraries include: +

+
    +
+

+ Some sites help index the libraries outside the Go distribution: +

+
    +
+

+ + Community and conferences + + + + [ + + + edit + + + ] + + +

+
    +
+

+ + Reception + + + + [ + + + edit + + + ] + + +

+

+ Go's initial release led to much discussion. +

+

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

+
+

+ 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: + + + + [ + + 63 + + ] + + + +

+
+

+ 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: + + + + [ + + 64 + + ] + + + +

+
+

+ 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, + + + + [ + + 65 + + ] + + + + surpassing established languages like + + Pascal + + . As of August 2014 + + , its ranking had dropped to 38th in the index, placing it lower than + + COBOL + + and + + Fortran + + . + + + + [ + + 66 + + ] + + + + Go is already in commercial use by several large organizations. + + + + [ + + 67 + + ] + + + +

+

+ Regarding Go, + + Bruce Eckel + + has stated: + + + + [ + + 68 + + ] + + + +

+
+

+ 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 + + + + [ + + + edit + + + ] + + +

+

+ 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. + + + + [ + + 69 + + ] + + + +

+

+ + Naming dispute + + + + [ + + + edit + + + ] + + +

+

+ 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. + + + + [ + + 70 + + ] + + + + 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." + + + + [ + + 71 + + ] + + + +

+

+ + See also + + + + [ + + + edit + + + ] + + +

+
    +
+
+ + + + + + + +
+ + Portal icon + + + + Free software portal + +
+
+

+ + Notes + + + + [ + + + edit + + + ] + + +

+
+
    +
+
+

+ + References + + + + [ + + + edit + + + ] + + +

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

+ + External links + + + + [ + + + edit + + + ] + + +

+
    +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+