Go 1.14 is not yet released. These are work-in-progress release notes. Go 1.14 is expected to be released in February 2020.
Module support in the go
command is now ready for production use,
and we encourage all users to migrate to Go modules for dependency management.
If you are unable to migrate due to a problem in the Go toolchain,
please ensure that the problem has an
open issue
filed. (If the issue is not on the Go1.15
milestone, please let us
know why it prevents you from migrating so that we can prioritize it
appropriately.)
Per the overlapping interfaces proposal, Go 1.14 now permits embedding of interfaces with overlapping method sets: methods from an embedded interface may have the same names and identical signatures as methods already present in the (embedding) interface. This solves problems that typically (but not exclusively) occur with diamond-shaped embedding graphs. Explicitly declared methods in an interface must remain unique, as before.
TODO: is Dragonfly passing? On both Dragonfly release & tip? (ABI change happened) Does the net package's interface APIs work on both? https://golang.org/issue/34368.
TODO: is Illumos up with a builder and passing? https://golang.org/issue/15581.
TODO: announce something about the Go Solaris port? Solaris itself is unmaintained? The builder is still running at Oracle, but the employee who set it up left the company and we have no way to maintain it.
Go 1.14 is the last release that will run on macOS 10.11 El Capitan. Go 1.15 will require macOS 10.12 Sierra or later.
Go 1.14 is the last Go release to support 32-bit binaries on
macOS (the darwin/386
port). They are no longer
supported by macOS, starting with macOS 10.15 (Catalina).
Go continues to support the 64-bit darwin/amd64
port.
Go 1.14 will likely be the last Go release to support 32-bit
binaries on iOS, iPadOS, watchOS, and tvOS
(the darwin/arm
port). Go continues to support the
64-bit darwin/arm64
port.
Go binaries on Windows now have DEP (Data Execution Prevention) enabled.
JavaScript values referenced from Go via js.Value
objects can now be garbage collected.
js.Value
values can no longer be compared using
the ==
operator, and instead must be compared using
their Equal
method.
js.Value
now
has IsUndefined
, IsNull
,
and IsNaN
methods.
Go 1.14 contains experimental support for 64-bit RISC-V on Linux
(GOOS=linux
, GOARCH=riscv64
). Be aware
that performance, assembly syntax stability, and possibly
correctness are a work in progress.
Go now supports the 64-bit ARM architecture on FreeBSD (the
freebsd/arm64
port).
As announced in the Go 1.13 release notes,
Go 1.14 drops support for the Native Client platform (GOOS=nacl
).
The runtime now respects zone CPU caps
(the zone.cpu-cap
resource control)
for runtime.NumCPU
and the default value
of GOMAXPROCS
.
When the main module contains a top-level vendor
directory and
its go.mod
file specifies go
1.14
or
higher, the go
command now defaults to -mod=vendor
for operations that accept that flag. A new value for that flag,
-mod=mod
, causes the go
command to instead load
modules from the module cache (as when no vendor
directory is
present).
When -mod=vendor
is set (explicitly or by default), the
go
command now verifies that the main module's
vendor/modules.txt
file is consistent with its
go.mod
file.
go
list
-m
no longer silently omits
transitive dependencies that do not provide packages in
the vendor
directory. It now fails explicitly if
-mod=vendor
is set and information is requested for a module not
mentioned in vendor/modules.txt
.
The go
get
command no longer accepts
the -mod
flag. Previously, the flag's setting either
was ignored or
caused the build to fail.
-mod=readonly
is now set by default when the go.mod
file is read-only and no top-level vendor
directory is present.
-modcacherw
is a new flag that instructs the go
command to leave newly-created directories in the module cache at their
default permissions rather than making them read-only.
The use of this flag makes it more likely that tests or other tools will
accidentally add files not included in the module's verified checksum.
However, it allows the use of rm
-rf
(instead of go
clean
-modcache
)
to remove the module cache.
-modfile=file
is a new flag that instructs the go
command to read (and possibly write) an alternate go.mod
file
instead of the one in the module root directory. A file
named go.mod
must still be present in order to determine the
module root directory, but it is not accessed. When -modfile
is
specified, an alternate go.sum
file is also used: its path is
derived from the -modfile
flag by trimming the .mod
extension and appending .sum
.
GOINSECURE
is a new environment variable that instructs
the go
command to not require an HTTPS connection, and to skip
certificate validation, when fetching certain modules directly from their
origins. Like the existing GOPRIVATE
variable, the value
of GOINSECURE
is a comma-separated list of glob patterns.
When module-aware mode is enabled explicitly (by setting
GO111MODULE=on
), most module commands have more
limited functionality if no go.mod
file is present. For
example, go
build
,
go
run
, and other build commands can only build
packages in the standard library and packages specified as .go
files on the command line.
Previously, the go
command would resolve each package path
to the latest version of a module but would not record the module path
or version. This resulted in slow,
non-reproducible builds.
go
get
continues to work as before, as do
go
mod
download
and
go
list
-m
with explicit versions.
+incompatible
versions
If the latest version of a module contains a go.mod
file,
go
get
will no longer upgrade to an
incompatible
major version of that module unless such a version is requested explicitly
or is already required.
go
list
also omits incompatible major versions
for such a module when fetching directly from version control, but may
include them if reported by a proxy.
go.mod
file maintenance
go
commands other than
go
mod
tidy
no longer
remove a require
directive that specifies a version of an indirect dependency
that is already implied by other (transitive) dependencies of the main
module.
go
commands other than
go
mod
tidy
no longer
edit the go.mod
file if the changes are only cosmetic.
When -mod=readonly
is set, go
commands will no
longer fail due to a missing go
directive or an erroneous
// indirect
comment.
The go
command now supports Subversion repositories in module mode.
The go
command now includes snippets of plain-text error messages
from module proxies and other HTTP servers.
An error message will only be shown if it is valid UTF-8 and consists of only
graphic characters and spaces.
go test -v
now streams t.Log
output as it happens,
rather than at the end of all tests.
This release improves the performance of most uses
of defer
to incur almost zero overhead compared to
calling the deferred function directly.
As a result, defer
can now be used in
performance-critical code without overhead concerns.
Goroutines are now asynchronously preemptible.
As a result, loops without function calls no longer potentially
deadlock the scheduler or significantly delay garbage collection.
This is supported on all platforms except windows/arm
,
darwin/arm
, js/wasm
, and
plan9/*
.
A consequence of the implementation of preemption is that on Unix
systems, including Linux and macOS systems, programs built with Go
1.14 will receive more signals than programs built with earlier
releases.
This means that programs that use packages
like syscall
or golang.org/x/sys/unix
will see more slow system calls fail with EINTR
errors.
Those programs will have to handle those errors in some way, most
likely looping to try the system call again. For more
information about this
see man
7 signal
for Linux systems or similar documentation for
other systems.
The page allocator is more efficient and incurs significantly less
lock contention at high values of GOMAXPROCS
.
This is most noticeable as lower latency and higher throughput for
large allocations being done in parallel and at a high rate.
Internal timers, used by
time.After
,
time.Tick
,
net.Conn.SetDeadline
,
and friends, are more efficient, with less lock contention and fewer
context switches.
This is a performance improvement that should not cause any user
visible changes.
This release adds -d=checkptr
as a compile-time option
for adding instrumentation to check that Go code is following
unsafe.Pointer
safety rules dynamically.
This option is enabled by default (except on Windows) with
the -race
or -msan
flags, and can be
disabled with -gcflags=all=-d=checkptr=0
.
Specifically, -d=checkptr
checks the following:
unsafe.Pointer
to *T
,
the resulting pointer must be aligned appropriately
for T
.
unsafe.Pointer
-typed operands must point
into the same object.
Using -d=checkptr
is not currently recommended on
Windows because it causes false alerts in the standard library.
The compiler can now emit machine-readable logs of key optimizations
using the -json
flag, including inlining, escape
analysis, bounds-check elimination, and nil-check elimination
Detailed escape analysis diagnostics (-m=2
) now work again.
This had been dropped from the new escape analysis implementation in
the previous release.
All Go symbols in macOS binaries now begin with an underscore, following platform conventions.
This release includes experimental support for compiler-inserted coverage instrumentation for fuzzing. See the issue for more details. This API may change in future releases.
TODO
This new package provides hash functions on byte sequences. These hash functions are intended to be used to implement hash tables or other data structures that need to map arbitrary strings or byte sequences to a uniform distribution of integers.
The hash functions are collision-resistant but not cryptographically secure.
TODO: https://golang.org/cl/191976: remove SSLv3 support
TODO: https://golang.org/cl/191999: remove TLS 1.3 opt-out
The tls
package no longer supports NPN and now only
supports ALPN. In previous releases it supported both. There are
no API changes and code should function identically as before.
Most other clients & servers have already removed NPN support in
favor of the standardized ALPN.
TODO: https://golang.org/cl/126624: handle ASN1's string type BMPString
Compact
no longer
escapes the U+2028
and U+2029
characters, which
was never a documented feature. For proper escaping, see HTMLEscape
.
TODO: https://golang.org/cl/186927: update type of .js and .mjs files to text/javascript
The new FMA
function
computes x*y+z
in floating point with no
intermediate rounding of the x*y
computation. Several architectures implement this computation
using dedicated hardware instructions for additional performance.
The GCD
function
now allows the inputs a
and b
to be
zero or negative.
The plugin
package now supports freebsd/amd64
.
StructOf
now
supports creating struct types with unexported fields, by
setting the PkgPath
field in
a StructField
element.
runtime.Goexit
can no longer be aborted by a
recursive panic
/recover
.
On macOS, SIGPIPE
is no longer forwarded to signal
handlers installed before the Go runtime is initialized.
This is necessary because macOS delivers SIGPIPE
to the main thread
rather than the thread writing to the closed pipe.
The generated profile no longer includes the pseudo-PCs used for inline marks. Symbol information of inlined functions is encoded in the format the pprof tool expects. This is a fix for the regression introduced during recent releases.
On Windows,
the CTRL_CLOSE_EVENT
, CTRL_LOGOFF_EVENT
,
and CTRL_SHUTDOWN_EVENT
events now generate
a syscall.SIGTERM
signal, similar to how Control-C
and Control-Break generate a syscall.SIGINT
signal.
Unlocking a highly contended Mutex
now directly
yields the CPU to the next goroutine waiting for
that Mutex
. This significantly improves the
performance of highly contended mutexes on high CPU count
machines.
The testing package now supports cleanup functions, called after
a test or benchmark has finished, by calling
T.Cleanup
or
B.Cleanup
respectively.
As always, there are various minor changes and updates to the library, made with the Go 1 promise of compatibility in mind.
TODO