RED TEXT IS FROM THE 1.1 DOC AND NEEDS TO BE UPDATED. (It is here for formatting and style reference.)
Since the release of Go version 1.1 in April, 2013, the release schedule has been shortened to make the release process more efficient. This release, Go version 1.2 or Go 1.2 for short, arrives roughly six months after 1.1, while 1.1 took over a year to appear after 1.0. Because of the shorter time scale, 1.2 is a smaller delta than the step from 1.0 to 1.1, but it still has some significant developments, including a better scheduler and one new language feature. Of course, Go 1.2 keeps the promise of compatibility. The overwhelming majority of programs built with Go 1.1 (or 1.0 for that matter) will run without any changes whatsoever when moved to 1.2, although the introduction of one restriction to a corner of the language may expose already-incorrect code (see the discussion of the use of nil).
In the interest of firming up the specification, one corner case has been clarified, with consequences for programs. There is also one new language feature.
The language now specifies that, for safety reasons, certain uses of nil pointers are guaranteed to trigger a run-time panic. For instance, in Go 1.0, given code like
type T struct {
X [1<<24]byte
Field int32
}
func main() {
var x *T
...
}
the nil pointer x could be used to access memory incorrectly:
the expression x.Field could access memory at address 1<<24.
To prevent such unsafe behavior, in Go 1.2 the compilers now guarantee that any indirection through
a nil pointer, such as illustrated here but also in nil pointers to arrays, nil interface values,
nil slices, and so on, will either panic or return a correct, safe non-nil value.
In short, any expression that explicitly or implicitly requires evaluation of a nil address is an error.
The implementation may inject extra tests into the compiled program to enforce this behavior.
Further details are in the design document.
Updating: Most code that depended on the old behavior is erroneous and will fail when run. Such programs will need to be updated by hand.
Go 1.2 adds the ability to specify the capacity as well as the length when using a slicing operation on an existing array or slice. A slicing operation creates a new slice by describing a contiguous section of an already-created array or slice:
var array [10]int slice := array[2:4]
The capacity of the slice is the maximum number of elements that the slice may hold, even after reslicing;
it reflects the size of the underlying array.
In this example, the capacity of the slice variable is 8.
Go 1.2 adds new syntax to allow a slicing operation to specify the capacity as well as the length. A second colon introduces the capacity value, which must be less than or equal to the capacity of the source slice or array, adjusted for the origin. For instance,
slice = array[2:4:6]
sets the slice to have the same length as in the earlier example but its capacity is now only 4 elements (6-2). It is impossible to use this new slice value to access the last two elements of the original array.
In this three-index notation, a missing first index ([:i:j]) defaults to zero but the other
two indices must always be specified explicitly.
It is possible that future releases of Go may introduce default values for these indices.
Further details are in the design document.
Updating: This is a backwards-compatible change that affects no existing programs.
A binary is still included with the distribution, but the source code for the
godoc command has moved to the
go.tools subrepository.
The core of the program has been split into a
library,
while the command itself is in a separate
directory.
The move allows the code to be updated easily and the separation into a library and command
makes it easier to construct custom binaries for local sites and different deployment methods.
Updating: Since godoc was not part of the library, no client code depends on the godoc sources and no updating is required.
The binary distributions available from
TODO
The GCC release schedule does not coincide with the Go release schedule, so some skew is inevitable in
TODO: write prose
The Go 1.1 tool chain adds experimental support for
An ARMv6 or later processor is required for
Go 1.1 adds experimental support for
The performance of code compiled with the Go 1.1 gc tool suite should be noticeably
better for most Go programs.
Typical improvements relative to Go 1.0 seem to be about 30%-40%, sometimes
much more, but occasionally less or even non-existent.
There are too many small performance-driven tweaks through the tools and libraries
to list them all here, but the following major changes are worth noting:
TODO: choose which to call out
The various routines to scan textual input in the
Updating:
To correct breakage caused by the new struct field,
The following list summarizes a number of minor changes to the library, mostly additions.
See the relevant package documentation for more information about each change.
$ go get code.google.com/p/go.tools/cmd/godoc
The vet tool moved to the go.tools subrepository
Status of gccgo
gccgo's releases.
The 4.8.0 version of GCC shipped in March, 2013 and includes a nearly-Go 1.1 version of gccgo.
Its library is a little behind the release, but the biggest difference is that method values are not implemented.
Sometime around July 2013, we expect 4.8.2 of GCC to ship with a gccgo
providing a complete Go 1.1 implementation.
TODO
Changes to the go command
Additional platforms
freebsd/arm,
netbsd/386, netbsd/amd64, netbsd/arm,
openbsd/386 and openbsd/amd64 platforms.
freebsd/arm or
netbsd/arm.
cgo on linux/arm.
Performance
Changes to the standard library
foo.Bar
bufio
package,
ReadBytes,
ReadString
and particularly
ReadLine,
are needlessly complex to use for simple purposes.
In Go 1.1, a new type,
Scanner,
has been added to make it easier to do simple tasks such as
read the input as a sequence of lines or space-delimited words.
It simplifies the problem by terminating the scan on problematic
input such as pathologically long lines, and having a simple
default: line-oriented input, with each line stripped of its terminator.
Here is code to reproduce the input a line at a time:
go fix will rewrite code to add tags for these types.
More generally, go vet will identify composite literals that
should be revised to use field tags.
Minor changes to the library
archive/zip package
adds the
DataOffset accessor
to return the offset of a file's (possibly compressed) data within the archive.
bufio package
adds Reset
methods to Reader and
Writer.
These methods allow the Readers
and Writers
to be re-used on new input and output readers and writers, saving
allocation overhead.
compress/bzip2
can now decompress concatenated archives.
compress/flate
package adds a Reset
method on the Writer,
allowing compression of one file to start with another's dictionary.
container/heap package
adds a Fix
method to provide a more efficient way to update an item's position in the heap.
container/list package
adds the MoveBefore
and
MoveAfter
methods, which implement the obvious rearrangement.
crypto/cipher package
adds the a new GCM mode (Galois Counter Mode), which is almost always
used with AES encryption.
crypto/md5 package
adds a new Sum function
to simplify hashing without sacrificing performance.
crypto/sha1 package
adds a new Sum function.
crypto/sha256 package
adds Sum256
and Sum224 functions.
crypto/sha512 package
adds Sum512 and
Sum384 functions.
crypto/x509 package
adds support for reading and writing arbitrary extensions.
crypto/tls package adds
support for TLS 1.1, 1.2 and AES-GCM.
database/sql package adds a
SetMaxOpenConns
method on DB to limit the
number of open connections to the database.
encoding/csv package
now always allows trailing commas on fields.
encoding/gob package
now supports the generic encoding interfaces of the
encoding package
described above.
encoding/json package
now will always escape ampersands as "\u0026" when printing strings.
It will now accept but correct invalid UTF-8 in
Marshal
(such input was previously rejected).
Finally, it now supports the generic encoding interfaces of the
encoding package
described above.
encoding/xml package
now allows attributes stored in pointers to be marshaled.
It also supports the generic encoding interfaces of the
encoding package
described above through the new
Marshaler,
Unmarshaler,
and related
MarshalerAttr and
UnmarshalerAttr
interfaces.
flag package now
has a Getter interface
to allow the value of a flag to be retrieved. Due to the
Go 1 compatibility guidelines, this method cannot be added to the existing
Value
interface, but all the existing standard flag types implement it.
The package also now exports the CommandLine
flag set, which holds the flags from the command line.
go/build package adds
the AllTags field
to the Package type,
to make it easier to process build tags.
image/draw package now
exports an interface, Drawer,
that wraps the standard Draw method.
The Porter-Duff operators now implement this interface, in effect binding an operation to
the draw operator rather than providing it explicitly.
Given a paletted image as its destination, the new
FloydSteinberg
implementation of the
Drawer
interface will use the Floyd-Steinberg error diffusion algorithm to draw the image.
To create palettes suitable for such processing, the new
Quantizer interface
represents implementations of quantization algorithms that choose a palette
given a full-color image.
There are no implementations of this interface in the library.
image/gif package
can now create GIF files using the new
Encode
and EncodeAll
functions.
Their options argument allows specification of an image
Quantizer to use;
if it is nil, the generated GIF will use the
Plan9
color map (palette) defined in the new
image/color/palette package.
The options also specify a
Drawer
to use to create the output image;
if it is nil, Floyd-Steinberg error diffusion is used.
Copy method of the
io package now prioritizes its
arguments differently.
If one argument implements WriterTo
and the other implements iReaderFrom,
Copy will now invoke
WriterTo to do the work,
so that less intermediate buffering is required in general.
runtime package relaxes
the constraints on finalizer functions in
SetFinalizer: the
actual argument can now be any type that is assignable to the formal type of
the function, as is the case for any normal function call in Go.
sort package has a new
Stable function that implements
stable sorting. It is less efficient than the normal sort algorithm, however.
strings package adds
an IndexByte
function for consistency with the bytes package.
testing package
now exports theTB interface.
It records the methods in common with the
T
and
B types,
to make it easier to share code between tests and benchmarks.
Also, the
AllocsPerRun
function now quantizes the return value to an integer (although it
still has type float64), to round off any error caused by
initialization and make the result more repeatable.
text/template package
now automatically dereferences pointer values when evaluating the arguments
to "escape" functions such as "html", to bring the behavior of such functions
in agreement with that of other printing functions such as "printf".
time package, the
Parse function
and
Format
method
now handle time zone offsets with seconds, such as in the historical
date "1871-01-01T05:33:02+00:34:08".
Also, pattern matching in the formats for those routines is stricter: a non-lowercase letter
must now follow the standard words such as "Jan" and "Mon".
unicode package
adds In,
a nicer-to-use but equivalent version of the original
IsOneOf,
to see whether a character is a member of a Unicode category.