DRAFT RELEASE NOTES - Introduction to Go 1.12

Go 1.12 is not yet released. These are work-in-progress release notes. Go 1.12 is expected to be released in February 2019.

The latest Go release, version 1.12, arrives six months after Go 1.11. Most of its changes are in TODO. As always, the release maintains the Go 1 promise of compatibility. We expect almost all Go programs to continue to compile and run as before.

Changes to the language

There are no changes to the language specification.

Ports

FreeBSD

Go 1.12 is the last release that is supported on FreeBSD 10.x, which has already reached end-of-life. Go 1.13 will require FreeBSD 11.2+ or FreeBSD 12.0+.

Darwin

Go 1.12 is the last release that will run on macOS 10.10 Yosemite. Go 1.13 will require macOS 10.11 El Capitan or later.

Tools

go tool vet no longer supported

The go vet command has been rewritten to serve as the base for a range of different source code analysis tools. See the golang.org/x/tools/go/analysis package for details. A side-effect is that go tool vet is no longer supported. External tools that use go tool vet must be changed to use go vet. Using go vet instead of go tool vet should work with all supported versions of Go.

Build cache requirement

The build cache is now required as a step toward eliminating $GOPATH/pkg. Setting the environment variable GOCACHE=off to disable the build cache has no effect in Go 1.12.

Compiler toolchain

The compiler's live variable analysis has improved. This may mean that finalizers will be executed sooner in this release than in previous releases. If that is a problem, consider the appropriate addition of a runtime.KeepAlive call.

More functions are now eligible for inlining by default, including functions that do nothing but call another function. This extra inlining makes it additionally important to use runtime.CallersFrames instead of iterating over the result of runtime.Callers directly.

// Old code which no longer works correctly (it will miss inlined call frames).
var pcs [10]uintptr
n := runtime.Callers(1, pcs[:])
for _, pc := range pcs[:n] {
	f := runtime.FuncForPC(pc)
	if f != nil {
		fmt.Println(f.Name())
	}
}
// New code which will work correctly.
var pcs [10]uintptr
n := runtime.Callers(1, pcs[:])
frames := runtime.CallersFrames(pcs[:n])
for {
	frame, more := frames.Next()
	fmt.Println(frame.Function)
	if !more {
		break
	}
}

Godoc

In Go 1.12, godoc no longer has a command-line interface and is only a web server. Users should use go doc for command-line help output instead.

Core library

All of the changes to the standard library are minor.

Minor changes to the library

As always, there are various minor changes and updates to the library, made with the Go 1 promise of compatibility in mind.

bufio

TODO: https://golang.org/cl/149297: make Reader.Peek invalidate Unreads

build

TODO: https://golang.org/cl/61511: support frame-pointer for arm64

bytes, strings

TODO: https://golang.org/cl/137855: add ReplaceAll

TODO: https://golang.org/cl/145098: fix Reader.UnreadRune returning without error on a zero Reader

cmd,runtime

TODO: https://golang.org/cl/138675: enable race detector on arm64

crypto/rand

TODO: https://golang.org/cl/120055: use the new getrandom syscall on FreeBSD

TODO: https://golang.org/cl/139419: warn to stderr if blocked 60+ sec on first Reader.Read call

crypto/rc4

TODO: https://golang.org/cl/130397: remove assembler implementations

crypto/tls, net/http

TODO: https://golang.org/cl/143177: reject HTTP requests to HTTPS server

database/sql

TODO: https://golang.org/cl/145738: add support for returning cursors to client

expvar

TODO: https://golang.org/cl/139537: add Map.Delete

fmt

TODO: https://golang.org/cl/129777: print values for map keys with non-reflexive equality

TODO: https://golang.org/cl/142737: print maps in key-sorted order

go/build, cmd/go

TODO: https://golang.org/cl/146023: add "hurd" as a GOOS value

go/doc

TODO: https://golang.org/cl/140958: add new mode bit PreserveAST to control clearing of data in AST

go/token

TODO: https://golang.org/cl/134075: add (*File).LineStart, which returns Pos for a given line

godoc, cmd/godoc

TODO: https://golang.org/cl/141397: remove CLI support

image

TODO: https://golang.org/cl/118755: make RegisterFormat safe for concurrent use

image/png

TODO: https://golang.org/cl/134235: pack image data for small bitdepth paletted images

internal/cpu

TODO: https://golang.org/cl/149578: move GODEBUGCPU options into GODEBUG

internal/poll

TODO: https://golang.org/cl/130676: use F_FULLFSYNC fcntl for FD.Fsync on OS X

io

TODO: https://golang.org/cl/139457: export StringWriter

lib/time

TODO: https://golang.org/cl/151299: update tzdata to 2018g

math/bits

TODO: https://golang.org/cl/123157: add extended precision Add, Sub, Mul, Div

net

TODO: https://golang.org/cl/113997: use splice(2) on Linux when reading from UnixConn, rework splice tests

TODO: https://golang.org/cl/146659: enable RFC 6555 Fast Fallback by default

TODO: https://golang.org/cl/107196: enable TCP keepalives by default

net/http

TODO: https://golang.org/cl/130115: add Client.CloseIdleConnections

TODO: https://golang.org/cl/145398: in Transport, don't error on non-chunked response with Trailer header

TODO: https://golang.org/cl/152080: update bundled x/net/http2

net/http/httputil

TODO: https://golang.org/cl/146437: make ReverseProxy automatically proxy WebSocket requests

os

TODO: https://golang.org/cl/125443: add ExitCode method to ProcessState

TODO: https://golang.org/cl/135075: add ModeCharDevice to ModeType

TODO: https://golang.org/cl/139418: add UserHomeDir

TODO: https://golang.org/cl/146020: add support for long path names on unix RemoveAll

path/filepath

TODO: https://golang.org/cl/145220: change IsAbs("NUL") to return true

reflect

TODO: https://golang.org/cl/33572: add Value.MapRange method and MapIter type

regexp

TODO: https://golang.org/cl/139783: add DeepEqual test

TODO: https://golang.org/cl/139784: add partial Deprecation comment to Copy

runtime

TODO: https://golang.org/cl/135395: use MADV_FREE on Linux if available

runtime/debug

TODO: https://golang.org/cl/144220: add API to read module info in binary

strings

TODO: https://golang.org/cl/122835: add Builder.Cap

TODO: https://golang.org/cl/131495: correctly handle invalid utf8 sequences in Map

syscall

TODO: https://golang.org/cl/125456: implement Unix Socket for Windows

TODO: https://golang.org/cl/138595: FreeBSD 12 ino64 support

TODO: https://golang.org/cl/141639: implement syscalls on Darwin using libSystem

TODO: https://golang.org/cl/147117: add Syscall18 on Windows

syscall/js

TODO: https://golang.org/cl/141644: add Wrapper interface to support external Value wrapper types

TODO: https://golang.org/cl/143137: make zero js.Value represent "undefined"

TODO: https://golang.org/cl/144384: add the Value.Truthy method

testing

TODO: https://golang.org/cl/121936: exit with error if testing.Short is called before flag.Parse

TODO: https://golang.org/cl/139258: implement -benchtime=100x

text/template

TODO: https://golang.org/cl/142217: removed truncation of context in error message