This page summarizes the changes between official stable releases of Go. The Mercurial change log has the full details.

To update to a specific release, use:

    hg pull
    hg update tag

## go1.3 (released 2014/06/18)

Go 1.3 is a major release of Go. Read the Go 1.3 Release Notes for more information.

## go1.2 (released 2013/12/01)

Go 1.2 is a major release of Go. Read the Go 1.2 Release Notes for more information.

### Minor revisions

go1.2.1 (released 2014/03/02) includes bug fixes to the `runtime`, `net`, and `database/sql` packages. See the change history for details.

go1.2.2 (released 2014/05/05) includes a security fix that affects the tour binary included in the binary distributions (thanks to Guillaume T).

## go1.1 (released 2013/05/13)

Go 1.1 is a major release of Go. Read the Go 1.1 Release Notes for more information.

### Minor revisions

go1.1.1 (released 2013/06/13) includes several compiler and runtime bug fixes. See the change history for details.

go1.1.2 (released 2013/08/13) includes fixes to the `gc` compiler and `cgo`, and the `bufio`, `runtime`, `syscall`, and `time` packages. See the change history for details. If you use package syscall's `Getrlimit` and `Setrlimit` functions under Linux on the ARM or 386 architectures, please note change 55ac276af5a7 that fixes issue 5949.

## go1 (released 2012/03/28)

Go 1 is a major release of Go that will be stable in the long term. Read the Go 1 Release Notes for more information.

It is intended that programs written for Go 1 will continue to compile and run correctly, unchanged, under future versions of Go 1. Read the Go 1 compatibility document for more about the future of Go 1.

The go1 release corresponds to `weekly.2012-03-27`.

### Minor revisions

go1.0.1 (released 2012/04/25) was issued to fix an escape analysis bug that can lead to memory corruption. It also includes several minor code and documentation fixes.

go1.0.2 (released 2012/06/13) was issued to fix two bugs in the implementation of maps using struct or array keys: issue 3695 and issue 3573. It also includes many minor code and documentation fixes.

go1.0.3 (released 2012/09/21) includes minor code and documentation fixes.

See the go1 release branch history for the complete list of changes.

## r60 (released 2011/09/07)

The r60 release corresponds to `weekly.2011-08-17`. This section highlights the most significant changes in this release. For a more detailed summary, see the weekly release notes. For complete information, see the Mercurial change list.

### Language

An "else" block is now required to have braces except if the body of the "else" is another "if". Since gofmt always puts those braces in anyway, gofmt-formatted programs will not be affected. To fix other programs, run gofmt.

### Packages

Package http's URL parsing and query escaping code (such as `ParseURL` and `URLEscape`) has been moved to the new url package, with several simplifications to the names. Client code can be updated automatically with gofix.

Package image has had significant changes made to the `Pix` field of struct types such as image.RGBA and image.NRGBA. The image.Image interface type has not changed, though, and you should not need to change your code if you don't explicitly refer to `Pix` fields. For example, if you decode a number of images using the image/jpeg package, compose them using image/draw, and then encode the result using image/png, then your code should still work as before. If your code does refer to `Pix` fields see the weekly.2011-07-19 snapshot notes for how to update your code.

Package template has been replaced with a new templating package (formerly `exp/template`). The original template package is still available as old/template. The `old/template` package is deprecated and will be removed. The Go tree has been updated to use the new template package. We encourage users of the old template package to switch to the new one. Code that uses `template` or `exp/template` will need to change its import lines to `"old/template"` or `"template"`, respectively.

### Tools

Goinstall now uses a new tag selection scheme. When downloading or updating, goinstall looks for a tag or branch with the `"go."` prefix that corresponds to the local Go version. For Go `release.r58` it looks for `go.r58`. For `weekly.2011-06-03` it looks for `go.weekly.2011-06-03`. If the specific `go.X` tag or branch is not found, it chooses the closest earlier version. If an appropriate tag or branch is found, goinstall uses that version of the code. Otherwise it uses the default version selected by the version control system. Library authors are encouraged to use the appropriate tag or branch names in their repositories to make their libraries more accessible.

### Minor revisions

r60.1 includes a linker fix, a pair of goplay fixes, and a `json` package fix and a new struct tag option.

r60.2 fixes a memory leak involving maps.

r60.3 fixes a reflect bug.

## r59 (released 2011/08/01)

The r59 release corresponds to `weekly.2011-07-07`. This section highlights the most significant changes in this release. For a more detailed summary, see the weekly release notes. For complete information, see the Mercurial change list.

### Language

This release includes a language change that restricts the use of `goto`. In essence, a `goto` statement outside a block cannot jump to a label inside that block. Your code may require changes if it uses `goto`. See this changeset for how the new rule affected the Go tree.

### Packages

As usual, gofix will handle the bulk of the rewrites necessary for these changes to package APIs.

Package http has a new FileSystem interface that provides access to files. The FileServer helper now takes a `FileSystem` argument instead of an explicit file system root. By implementing your own `FileSystem` you can use the `FileServer` to serve arbitrary data.

Package os's `ErrorString` type has been hidden. Most uses of `os.ErrorString` can be replaced with os.NewError.

Package reflect supports a new struct tag scheme that enables sharing of struct tags between multiple packages. In this scheme, the tags must be of the form:

    	`key:"value" key2:"value2"`

The StructField type's Tag field now has type StructTag, which has a `Get` method. Clients of json and xml will need to be updated. Code that says

    	type T struct {
    		X int "name"
    	}

should become

    	type T struct {
    		X int `json:"name"`  // or `xml:"name"`
    	}

Use govet to identify struct tags that need to be changed to use the new syntax.

Package sort's `IntArray` type has been renamed to IntSlice, and similarly for Float64Slice and StringSlice.

Package strings's `Split` function has itself been split into Split and SplitN. `SplitN` is the same as the old `Split`. The new `Split` is equivalent to `SplitN` with a final argument of -1.

Package image/draw's Draw function now takes an additional argument, a compositing operator. If in doubt, use draw.Over.

### Tools

Goinstall now installs packages and commands from arbitrary remote repositories (not just Google Code, Github, and so on). See the goinstall documentation for details.

## r58 (released 2011/06/29)

The r58 release corresponds to `weekly.2011-06-09` with additional bug fixes. This section highlights the most significant changes in this release. For a more detailed summary, see the weekly release notes. For complete information, see the Mercurial change list.

### Language

This release fixes a use of uninitialized memory in programs that misuse `goto`.

### Packages

As usual, gofix will handle the bulk of the rewrites necessary for these changes to package APIs.

Package http drops the `finalURL` return value from the Client.Get method. The value is now available via the new `Request` field on http.Response. Most instances of the type map[string][]string in have been replaced with the new Values type.

Package exec has been redesigned with a more convenient and succinct API.

Package strconv's Quote function now escapes only those Unicode code points not classified as printable by unicode.IsPrint. Previously Quote would escape all non-ASCII characters. This also affects the fmt package's `"%q"` formatting directive. The previous quoting behavior is still available via strconv's new QuoteToASCII function.

Package os/signal's Signal and UnixSignal types have been moved to the os package.

Package image/draw is the new name for `exp/draw`. The GUI-related code from `exp/draw` is now located in the exp/gui package.

### Tools

Goinstall now observes the GOPATH environment variable to build and install your own code and external libraries outside of the Go tree (and avoid writing Makefiles).

### Minor revisions

r58.1 adds build and runtime changes to make Go run on OS X 10.7 Lion.

## r57 (released 2011/05/03)

The r57 release corresponds to `weekly.2011-04-27` with additional bug fixes. This section highlights the most significant changes in this release. For a more detailed summary, see the weekly release notes. For complete information, see the Mercurial change list.

The new gofix tool finds Go programs that use old APIs and rewrites them to use newer ones. After you update to a new Go release, gofix helps make the necessary changes to your programs. Gofix will handle the http, os, and syscall package changes described below, and we will update the program to keep up with future changes to the libraries. Gofix can’t handle all situations perfectly, so read and test the changes it makes before committing them. See the gofix blog post for more information.

### Language

Multiple assignment syntax replaces the `closed` function. The syntax for channel receives allows an optional second assigned value, a boolean value indicating whether the channel is closed. This code:

    	v := <-ch
    	if closed(ch) {
    		// channel is closed
    	}

should now be written as:

    	v, ok := <-ch
    	if !ok {
    		// channel is closed
    	}

Unused labels are now illegal, just as unused local variables are.

### Packages

Package gob will now encode and decode values of types that implement the GobEncoder and GobDecoder interfaces. This allows types with unexported fields to transmit self-consistent descriptions; examples include big.Int and big.Rat.

Package http has been redesigned. For clients, there are new Client and Transport abstractions that give more control over HTTP details such as headers sent and redirections followed. These abstractions make it easy to implement custom clients that add functionality such as OAuth2. For servers, ResponseWriter has dropped its non-essential methods. The Hijack and Flush methods are no longer required; code can test for them by checking whether a specific value implements Hijacker or Flusher. The RemoteAddr and UsingTLS methods are replaced by Request's RemoteAddr and TLS fields. The SetHeader method is replaced by a Header method; its result, of type Header, implements Set and other methods.

Package net drops the `laddr` argument from Dial and drops the `cname` return value from LookupHost. The implementation now uses cgo to implement network name lookups using the C library getaddrinfo(3) function when possible. This ensures that Go and C programs resolve names the same way and also avoids the OS X application-level firewall.

Package os introduces simplified Open and Create functions. The original Open is now available as OpenFile. The final three arguments to StartProcess have been replaced by a pointer to a ProcAttr.

Package reflect has been redesigned. Type is now an interface that implements all the possible type methods. Instead of a type switch on a Type `t`, switch on `t.Kind()`. Value is now a struct value that implements all the possible value methods. Instead of a type switch on a Value `v`, switch on `v.Kind()`. Typeof and NewValue are now called TypeOf and ValueOf To create a writable Value, use `New(t).Elem()` instead of `Zero(t)`. See the change description for the full details. The new API allows a more efficient implementation of Value that avoids many of the allocations required by the previous API.

Remember that gofix will handle the bulk of the rewrites necessary for these changes to package APIs.

### Tools

Gofix, a new command, is described above.

Gotest is now a Go program instead of a shell script. The new `-test.short` flag in combination with package testing's Short function allows you to write tests that can be run in normal or “short” mode; all.bash runs tests in short mode to reduce installation time. The Makefiles know about the flag: use `make testshort`.

The run-time support now implements CPU and memory profiling. Gotest's new `-test.cpuprofile` and `-test.memprofile` flags make it easy to profile tests. To add profiling to your web server, see the http/pprof documentation. For other uses, see the runtime/pprof documentation.

### Minor revisions

r57.1 fixes a nil pointer dereference in http.FormFile.

r57.2 fixes a use of uninitialized memory in programs that misuse `goto`.

## r56 (released 2011/03/16)

The r56 release was the first stable release and corresponds to `weekly.2011-03-07.1`. The numbering starts at 56 because before this release, what we now consider weekly snapshots were called releases.