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
Go 1.1 is a major release of Go. Read the Go 1.1 Release Notes for more information.
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.
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
.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Goinstall now installs packages and commands from arbitrary remote repositories (not just Google Code, Github, and so on). See the goinstall documentation for details.
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.
This release fixes a use of uninitialized memory in programs that misuse goto
.
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.
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).
r58.1 adds build and runtime changes to make Go run on OS X 10.7 Lion.
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.
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.
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.
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.
r57.1 fixes a nil pointer dereference in http.FormFile.
r57.2 fixes a use of uninitialized memory in programs that misuse goto
.
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.