mirror of
https://github.com/golang/go
synced 2024-11-12 03:00:22 -07:00
478bde3a43
Sub provides a convenient way to refer to a subdirectory automatically in future operations, like Unix's chdir(2). The CL also includes updates to fstest to check Sub implementations. As part of updating fstest, I changed the meaning of TestFS's expected list to introduce a special case: if you list no expected files, that means the FS must be empty. In general it's OK not to list all the expected files, but if you list none, that's almost certainly a mistake - if your FS were broken and empty, you wouldn't find out. Making no expected files mean "must be empty" makes the mistake less likely - if your file system ever worked, then your test will keep it working. That change found a testing bug: embedtest was making exactly that mistake. Fixes #42322. Change-Id: I63fd4aa866b30061a0e51ca9a1927e576d6ec41e Reviewed-on: https://go-review.googlesource.com/c/go/+/274856 Trust: Russ Cox <rsc@golang.org> Run-TryBot: Russ Cox <rsc@golang.org> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
894 lines
35 KiB
HTML
894 lines
35 KiB
HTML
<!--{
|
||
"Title": "Go 1.16 Release Notes",
|
||
"Path": "/doc/go1.16"
|
||
}-->
|
||
|
||
<!--
|
||
NOTE: In this document and others in this directory, the convention is to
|
||
set fixed-width phrases with non-fixed-width spaces, as in
|
||
<code>hello</code> <code>world</code>.
|
||
Do not send CLs removing the interior tags from such phrases.
|
||
-->
|
||
|
||
<style>
|
||
main ul li { margin: 0.5em 0; }
|
||
</style>
|
||
|
||
<h2 id="introduction">DRAFT RELEASE NOTES — Introduction to Go 1.16</h2>
|
||
|
||
<p>
|
||
<strong>
|
||
Go 1.16 is not yet released. These are work-in-progress
|
||
release notes. Go 1.16 is expected to be released in February 2021.
|
||
</strong>
|
||
</p>
|
||
|
||
<h2 id="language">Changes to the language</h2>
|
||
|
||
<p>
|
||
TODO
|
||
</p>
|
||
|
||
<h2 id="ports">Ports</h2>
|
||
|
||
<h3 id="darwin">Darwin and iOS</h3>
|
||
|
||
<p><!-- golang.org/issue/38485, golang.org/issue/41385, CL 266373, more CLs -->
|
||
Go 1.16 adds support of 64-bit ARM architecture on macOS (also known as
|
||
Apple Silicon) with <code>GOOS=darwin</code>, <code>GOARCH=arm64</code>.
|
||
Like the <code>darwin/amd64</code> port, the <code>darwin/arm64</code>
|
||
port supports cgo, internal and external linking, <code>c-archive</code>,
|
||
<code>c-shared</code>, and <code>pie</code> build modes, and the race
|
||
detector.
|
||
</p>
|
||
|
||
<p><!-- CL 254740 -->
|
||
The iOS port, which was previously <code>darwin/arm64</code>, has
|
||
been renamed to <code>ios/arm64</code>. <code>GOOS=ios</code>
|
||
implies the
|
||
<code>darwin</code> build tag, just as <code>GOOS=android</code>
|
||
implies the <code>linux</code> build tag. This change should be
|
||
transparent to anyone using gomobile to build iOS apps.
|
||
</p>
|
||
|
||
<p><!-- golang.org/issue/42100, CL 263798 -->
|
||
Go 1.16 adds an <code>ios/amd64</code> port, which targets the iOS
|
||
simulator running on AMD64-based macOS. Previously this was
|
||
unofficially supported through <code>darwin/amd64</code> with
|
||
the <code>ios</code> build tag set.
|
||
</p>
|
||
|
||
<p><!-- golang.org/issue/23011 -->
|
||
Go 1.16 is the last release that will run on macOS 10.12 Sierra.
|
||
Go 1.17 will require macOS 10.13 High Sierra or later.
|
||
</p>
|
||
|
||
<h3 id="netbsd">NetBSD</h3>
|
||
|
||
<p><!-- golang.org/issue/30824 -->
|
||
Go now supports the 64-bit ARM architecture on NetBSD (the
|
||
<code>netbsd/arm64</code> port).
|
||
</p>
|
||
|
||
<h3 id="386">386</h3>
|
||
|
||
<p><!-- golang.org/issue/40255, golang.org/issue/41848, CL 258957, and CL 260017 -->
|
||
As <a href="go1.15#386">announced</a> in the Go 1.15 release notes,
|
||
Go 1.16 drops support for x87 mode compilation (<code>GO386=387</code>).
|
||
Support for non-SSE2 processors is now available using soft float
|
||
mode (<code>GO386=softfloat</code>).
|
||
Users running on non-SSE2 processors should replace <code>GO386=387</code>
|
||
with <code>GO386=softfloat</code>.
|
||
</p>
|
||
|
||
<h2 id="tools">Tools</h2>
|
||
|
||
<p>
|
||
TODO
|
||
</p>
|
||
|
||
<h3 id="go-command">Go command</h3>
|
||
|
||
<h4 id="modules">Modules</h4>
|
||
|
||
<p><!-- golang.org/issue/41330 -->
|
||
Module-aware mode is enabled by default, regardless of whether a
|
||
<code>go.mod</code> file is present in the current working directory or a
|
||
parent directory. More precisely, the <code>GO111MODULE</code> environment
|
||
variable now defaults to <code>on</code>. To switch to the previous behavior,
|
||
set <code>GO111MODULE</code> to <code>auto</code>.
|
||
</p>
|
||
|
||
<p><!-- golang.org/issue/40728 -->
|
||
Build commands like <code>go</code> <code>build</code> and <code>go</code>
|
||
<code>test</code> no longer modify <code>go.mod</code> and <code>go.sum</code>
|
||
by default. Instead, they report an error if a module requirement or checksum
|
||
needs to be added or updated (as if the <code>-mod=readonly</code> flag were
|
||
used). Module requirements and sums may be adjusted with <code>go</code>
|
||
<code>mod</code> <code>tidy</code> or <code>go</code> <code>get</code>.
|
||
</p>
|
||
|
||
<p><!-- golang.org/issue/40276 -->
|
||
<code>go</code> <code>install</code> now accepts arguments with
|
||
version suffixes (for example, <code>go</code> <code>install</code>
|
||
<code>example.com/cmd@v1.0.0</code>). This causes <code>go</code>
|
||
<code>install</code> to build and install packages in module-aware mode,
|
||
ignoring the <code>go.mod</code> file in the current directory or any parent
|
||
directory, if there is one. This is useful for installing executables without
|
||
affecting the dependencies of the main module.
|
||
</p>
|
||
|
||
<p><!-- golang.org/issue/40276 -->
|
||
<code>go</code> <code>install</code>, with or without a version suffix (as
|
||
described above), is now the recommended way to build and install packages in
|
||
module mode. <code>go</code> <code>get</code> should be used with the
|
||
<code>-d</code> flag to adjust the current module's dependencies without
|
||
building packages, and use of <code>go</code> <code>get</code> to build and
|
||
install packages is deprecated. In a future release, the <code>-d</code> flag
|
||
will always be enabled.
|
||
</p>
|
||
|
||
<p><!-- golang.org/issue/24031 -->
|
||
<code>retract</code> directives may now be used in a <code>go.mod</code> file
|
||
to indicate that certain published versions of the module should not be used
|
||
by other modules. A module author may retract a version after a severe problem
|
||
is discovered or if the version was published unintentionally.<br>
|
||
</p>
|
||
|
||
<p><!-- golang.org/issue/26603 -->
|
||
The <code>go</code> <code>mod</code> <code>vendor</code>
|
||
and <code>go</code> <code>mod</code> <code>tidy</code> subcommands now accept
|
||
the <code>-e</code> flag, which instructs them to proceed despite errors in
|
||
resolving missing packages.
|
||
</p>
|
||
|
||
<p><!-- golang.org/issue/36465 -->
|
||
The <code>go</code> command now ignores requirements on module versions
|
||
excluded by <code>exclude</code> directives in the main module. Previously,
|
||
the <code>go</code> command used the next version higher than an excluded
|
||
version, but that version could change over time, resulting in
|
||
non-reproducible builds.
|
||
</p>
|
||
|
||
<h4 id="embed">Embedding Files</h4>
|
||
|
||
<p>
|
||
The <code>go</code> command now supports including
|
||
static files and file trees as part of the final executable,
|
||
using the new <code>//go:embed</code> directive.
|
||
See the documentation for the new
|
||
<a href="/pkg/embed/"><code>embed</code></a>
|
||
package for details.
|
||
</p>
|
||
|
||
<h4 id="go-test"><code>go</code> <code>test</code></h4>
|
||
|
||
<p><!-- golang.org/issue/29062 -->
|
||
When using <code>go</code> <code>test</code>, a test that
|
||
calls <code>os.Exit(0)</code> during execution of a test function
|
||
will now be considered to fail.
|
||
This will help catch cases in which a test calls code that calls
|
||
<code>os.Exit(0)</code> and thereby stops running all future tests.
|
||
If a <code>TestMain</code> function calls <code>os.Exit(0)</code>
|
||
that is still considered to be a passing test.
|
||
</p>
|
||
|
||
<p><!-- golang.org/issue/39484 -->
|
||
<code>go</code> <code>test</code> reports an error when the <code>-c</code>
|
||
or <code>-i</code> flags are used together with unknown flags. Normally,
|
||
unknown flags are passed to tests, but when <code>-c</code> or <code>-i</code>
|
||
are used, tests are not run.
|
||
</p>
|
||
|
||
<h4 id="go-get"><code>go</code> <code>get</code></h4>
|
||
|
||
<p><!-- golang.org/issue/37519 -->
|
||
The <code>go</code> <code>get</code> <code>-insecure</code> flag is
|
||
deprecated and will be removed in a future version. This flag permits
|
||
fetching from repositories and resolving custom domains using insecure
|
||
schemes such as HTTP, and also bypassess module sum validation using the
|
||
checksum database. To permit the use of insecure schemes, use the
|
||
<code>GOINSECURE</code> environment variable instead. To bypass module
|
||
sum validation, use <code>GOPRIVATE</code> or <code>GONOSUMDB</code>.
|
||
See <code>go</code> <code>help</code> <code>environment</code> for details.
|
||
</p>
|
||
|
||
<p><!-- golang.org/cl/263267 -->
|
||
<code>go</code> <code>get</code> <code>example.com/mod@patch</code> now
|
||
requires that some version of <code>example.com/mod</code> already be
|
||
required by the main module.
|
||
(However, <code>go</code> <code>get</code> <code>-u=patch</code> continues
|
||
to patch even newly-added dependencies.)
|
||
</p>
|
||
|
||
<h4 id="govcs"><code>GOVCS</code> environment variable</h4>
|
||
|
||
<p><!-- golang.org/issue/266420 -->
|
||
<code>GOVCS</code> is a new environment variable that limits which version
|
||
control tools the <code>go</code> command may use to download source code.
|
||
This mitigates security issues with tools that are typically used in trusted,
|
||
authenticated environments. By default, <code>git</code> and <code>hg</code>
|
||
may be used to download code from any repository. <code>svn</code>,
|
||
<code>bzr</code>, and <code>fossil</code> may only be used to download code
|
||
from repositories with module paths or package paths matching patterns in
|
||
the <code>GOPRIVATE</code> environment variable. See
|
||
<a href="/cmd/go/#hdr-Controlling_version_control_with_GOVCS"><code>go</code>
|
||
<code>help</code> <code>vcs</code></a> for details.
|
||
</p>
|
||
|
||
<h4 id="all-pattern">The <code>all</code> pattern</h4>
|
||
|
||
<p><!-- golang.org/cl/240623 -->
|
||
When the main module's <code>go.mod</code> file
|
||
declares <code>go</code> <code>1.16</code> or higher, the <code>all</code>
|
||
package pattern now matches only those packages that are transitively imported
|
||
by a package or test found in the main module. (Packages imported by <em>tests
|
||
of</em> packages imported by the main module are no longer included.) This is
|
||
the same set of packages retained
|
||
by <code>go</code> <code>mod</code> <code>vendor</code> since Go 1.11.
|
||
</p>
|
||
|
||
<h4 id="toolexec">The <code>-toolexec</code> build flag</h4>
|
||
|
||
<p><!-- golang.org/cl/263357 -->
|
||
When the <code>-toolexec</code> build flag is specified to use a program when
|
||
invoking toolchain programs like compile or asm, the environment variable
|
||
<code>TOOLEXEC_IMPORTPATH</code> is now set to the import path of the package
|
||
being built.
|
||
</p>
|
||
|
||
<h4 id="i-flag">The <code>-i</code> build flag</h4>
|
||
|
||
<p><!-- golang.org/issue/41696 -->
|
||
The <code>-i</code> flag accepted by <code>go</code> <code>build</code>,
|
||
<code>go</code> <code>install</code>, and <code>go</code> <code>test</code> is
|
||
now deprecated. The <code>-i</code> flag instructs the <code>go</code> command
|
||
to install packages imported by packages named on the command line. Since
|
||
the build cache was introduced in Go 1.10, the <code>-i</code> flag no longer
|
||
has a significant effect on build times, and it causes errors when the install
|
||
directory is not writable.
|
||
</p>
|
||
|
||
<h4 id="list-buildid">The <code>list</code> command</h4>
|
||
|
||
<p><!-- golang.org/cl/263542 -->
|
||
When the <code>-export</code> flag is specified, the <code>BuildID</code>
|
||
field is now set to the build ID of the compiled package. This is equivalent
|
||
to running <code>go</code> <code>tool</code> <code>buildid</code> on
|
||
<code>go</code> <code>list</code> <code>-exported</code> <code>-f</code> <code>{{.Export}</code>,
|
||
but without the extra step.
|
||
</p>
|
||
|
||
<h3 id="cgo">Cgo</h3>
|
||
|
||
<p><!-- CL 252378 -->
|
||
The <a href="/cmd/cgo">cgo</a> tool will no longer try to translate
|
||
C struct bitfields into Go struct fields, even if their size can be
|
||
represented in Go. The order in which C bitfields appear in memory
|
||
is implementation dependent, so in some cases the cgo tool produced
|
||
results that were silently incorrect.
|
||
</p>
|
||
|
||
<h3 id="vet">Vet</h3>
|
||
|
||
<p>
|
||
TODO
|
||
|
||
<!-- CL 235677: https://golang.org/cl/235677: cmd/vet: bring in pass to catch invalid uses of testing.T in goroutines -->
|
||
</p>
|
||
|
||
<h2 id="runtime">Runtime</h2>
|
||
|
||
<p>
|
||
The new <a href="/pkg/runtime/metrics/"><code>runtime/metrics</code></a> package
|
||
introduces a stable interface for reading
|
||
implementation-defined metrics from the Go runtime.
|
||
It supersedes existing functions like
|
||
<a href="/pkg/runtime/#ReadMemStats"><code>runtime.ReadMemStats</code></a>
|
||
and
|
||
<a href="/pkg/runtime/debug/#GCStats"><code>debug.GCStats</code></a>
|
||
and is significantly more general and efficient.
|
||
See the package documentation for more details.
|
||
</p>
|
||
|
||
<p><!-- CL 254659 -->
|
||
Setting the <code>GODEBUG</code> environment variable
|
||
to <code>inittrace=1</code> now causes the runtime to emit a single
|
||
line to standard error for each package <code>init</code>,
|
||
summarizing its execution time and memory allocation. This trace can
|
||
be used to find bottlenecks or regressions in Go startup
|
||
performance.
|
||
The <a href="/pkg/runtime/#hdr-Environment_Variables"><code>GODEBUG</code><
|
||
documentation</a> describes the format.
|
||
</p>
|
||
|
||
<p><!-- CL 267100 -->
|
||
On Linux, the runtime now defaults to releasing memory to the
|
||
operating system promptly (using <code>MADV_DONTNEED</code>), rather
|
||
than lazily when the operating system is under memory pressure
|
||
(using <code>MADV_FREE</code>). This means process-level memory
|
||
statistics like RSS will more accurately reflect the amount of
|
||
physical memory being used by Go processes. Systems that are
|
||
currently using <code>GODEBUG=madvdontneed=1</code> to improve
|
||
memory monitoring behavior no longer need to set this environment
|
||
variable.
|
||
</p>
|
||
|
||
<p><!-- CL 220419, CL 271987 -->
|
||
The race detector's model for channel operations now more precisely
|
||
follows the <a href="/ref/mem">Go memory model</a>. As a result, it
|
||
may report now races that it previously missed.
|
||
</p>
|
||
|
||
<h2 id="compiler">Compiler</h2>
|
||
|
||
<p><!-- CL 256459, CL 264837, CL 266203, CL 256460 -->
|
||
The compiler can now inline functions with
|
||
non-labeled <code>for</code> loops, method values, and type
|
||
switches. The inliner can also detect more indirect calls where
|
||
inlining is possible.
|
||
</p>
|
||
|
||
<h2 id="linker">Linker</h2>
|
||
|
||
<p><!-- CL 248197 -->
|
||
This release includes additional improvements to the Go linker,
|
||
reducing linker resource usage (both time and memory) and improving
|
||
code robustness/maintainability. These changes form the second half
|
||
of a two-release project to
|
||
<a href="https://golang.org/s/better-linker">modernize the Go
|
||
linker</a>.
|
||
</p>
|
||
|
||
<p>
|
||
The linker changes in 1.16 extend the 1.15 improvements to all
|
||
supported architecture/OS combinations (the 1.15 performance improvements
|
||
were primarily focused on <code>ELF</code>-based OSes and
|
||
<code>amd64</code> architectures). For a representative set of
|
||
large Go programs, linking is 20-35% faster than 1.15 and requires
|
||
5-15% less memory on average for <code>linux/amd64</code>, with larger
|
||
improvements for other architectures and OSes.
|
||
</p>
|
||
|
||
<p>
|
||
TODO: update with final numbers later in the release.
|
||
</p>
|
||
|
||
<p><!-- CL 255259 -->
|
||
On Windows, <code>go build -buildmode=c-shared</code> now generates Windows
|
||
ASLR DLLs by default. ASLR can be disabled with <code>--ldflags=-aslr=false</code>.
|
||
</p>
|
||
|
||
<h2 id="library">Core library</h2>
|
||
|
||
<h3 id="library-embed">Embedded Files</h3>
|
||
|
||
<p>
|
||
The new <a href="/pkg/embed/"><code>embed</code></a> package
|
||
provides access to files embedded in the program during compilation
|
||
using the new <a href="#embed"><code>//go:embed</code> directive</a>.
|
||
</p>
|
||
|
||
<h3 id="fs">File Systems</h3>
|
||
|
||
<p>
|
||
The new <a href="/pkg/io/fs/"><code>io/fs</code></a> package
|
||
defines an abstraction for read-only trees of files,
|
||
the <a href="/pkg/io/fs/#FS"><code>fs.FS</code></a> interface,
|
||
and the standard library packages have
|
||
been adapted to make use of the interface as appropriate.
|
||
</p>
|
||
|
||
<p>
|
||
On the producer side of the interface,
|
||
the new <a href="/pkg/embed/#FS">embed.FS</code></a> type
|
||
implements <code>fs.FS</code>, as does
|
||
<a href="/pkg/archive/zip/#Reader"><code>zip.Reader</code></a>.
|
||
The new <a href="/pkg/os/#DirFS"><code>os.DirFS</code></a> function
|
||
provides an implementation of <code>fs.FS</code> backed by a tree
|
||
of operating system files.
|
||
</p>
|
||
|
||
<p>
|
||
On the consumer side,
|
||
the new <a href="/pkg/net/http/#FS"><code>http.FS</code></a>
|
||
function converts an <code>fs.FS</code> to an
|
||
<a href="/pkg/net/http/#Handler"><code>http.Handler</code></a>.
|
||
Also, the <a href="/pkg/html/template/"><code>html/template</code></a>
|
||
and <a href="/pkg/text/template/"><code>text/template</code></a>
|
||
packages’ <a href="/pkg/html/template/#ParseFS"><code>ParseFS</code></a>
|
||
functions and methods read templates from an <code>fs.FS</code>.
|
||
</p>
|
||
|
||
<p>
|
||
For testing code that implements <code>fs.FS</code>,
|
||
the new <a href="/pkg/testing/fstest/"><code>testing/fstest</code></a>
|
||
package provides a <a href="/pkg/testing/fstest/#TestFS"><code>TestFS</code></a>
|
||
function that checks for and reports common mistakes.
|
||
It also provides a simple in-memory file system implementation,
|
||
<a href="/pkg/testing/fstest/#MapFS"><code>MapFS</code></a>,
|
||
which can be useful for testing code that accepts <code>fs.FS</code>
|
||
implementations.
|
||
</p>
|
||
|
||
<p>
|
||
TODO: when the "Minor changes to the library" section is close to completion,
|
||
decide if any changes are worth factoring out and highlighting in "Core library"
|
||
</p>
|
||
|
||
<h3 id="minor_library_changes">Minor changes to the library</h3>
|
||
|
||
<p>
|
||
As always, there are various minor changes and updates to the library,
|
||
made with the Go 1 <a href="/doc/go1compat">promise of compatibility</a>
|
||
in mind.
|
||
</p>
|
||
|
||
<p>
|
||
TODO: complete this section, resolve TODOs below, add missing entries
|
||
</p>
|
||
|
||
<dl id="crypto/dsa"><dt><a href="/pkg/crypto/dsa/">crypto/dsa</a></dt>
|
||
<dd>
|
||
<p><!-- CL 257939 -->
|
||
The <a href="/pkg/crypto/dsa/"><code>crypto/dsa</code></a> package is now deprecated.
|
||
See <a href="https://golang.org/issue/40337">issue #40337</a>.
|
||
</p>
|
||
</dd>
|
||
</dl><!-- crypto/dsa -->
|
||
|
||
<dl id="crypto/hmac"><dt><a href="/pkg/crypto/hmac/">crypto/hmac</a></dt>
|
||
<dd>
|
||
<p><!-- CL 261960 -->
|
||
<a href="/pkg/crypto/hmac/#New">New</a> will now panic if separate calls to
|
||
the hash generation function fail to return new values. Previously, the
|
||
behavior was undefined and invalid outputs were sometimes generated.
|
||
</p>
|
||
</dd>
|
||
</dl><!-- crypto/hmac -->
|
||
|
||
<dl id="crypto/tls"><dt><a href="/pkg/crypto/tls/">crypto/tls</a></dt>
|
||
<dd>
|
||
<p><!-- CL 256897 -->
|
||
I/O operations on closing or closed TLS connections can now be detected using
|
||
the new <a href="/pkg/net/#ErrClosed">ErrClosed</a> error. A typical use
|
||
would be <code>errors.Is(err, net.ErrClosed)</code>. In earlier releases
|
||
the only way to reliably detect this case was to match the string returned
|
||
by the <code>Error</code> method with <code>"tls: use of closed connection"</code>.
|
||
</p>
|
||
|
||
<p><!-- CL 266037 -->
|
||
A default deadline is set in <a href="/pkg/crypto/tls/#Conn.Close">Close</a>
|
||
before sending the close notify alert, in order to prevent blocking
|
||
indefinitely.
|
||
</p>
|
||
|
||
<p><!-- CL 246338 -->
|
||
<a href="/pkg/crypto/tls#Conn.HandshakeContext">(*Conn).HandshakeContext</a> was added to
|
||
allow the user to control cancellation of an in-progress TLS Handshake.
|
||
The context provided is propagated into the
|
||
<a href="/pkg/crypto/tls#ClientHelloInfo">ClientHelloInfo</a>
|
||
and <a href="/pkg/crypto/tls#CertificateRequestInfo">CertificateRequestInfo</a>
|
||
structs and accessible through the new
|
||
<a href="/pkg/crypto/tls#ClientHelloInfo.Context">(*ClientHelloInfo).Context</a>
|
||
and
|
||
<a href="/pkg/crypto/tls#CertificateRequestInfo.Context">
|
||
(*CertificateRequestInfo).Context
|
||
</a> methods respectively. Canceling the context after the handshake has finished
|
||
has no effect.
|
||
</p>
|
||
|
||
<p><!-- CL 239748 -->
|
||
Clients now ensure that the server selects
|
||
<a href="/pkg/crypto/tls/#ConnectionState.NegotiatedProtocol">
|
||
an ALPN protocol</a> from
|
||
<a href="/pkg/crypto/tls/#Config.NextProtos">
|
||
the list advertised by the client</a>.
|
||
</p>
|
||
|
||
<p><!-- CL 262857 -->
|
||
TLS servers will now prefer other AEAD cipher suites (such as ChaCha20Poly1305)
|
||
over AES-GCM cipher suites if either the client or server doesn't have AES hardware
|
||
support, unless the application set both
|
||
<a href="/pkg/crypto/tls/#Config.PreferServerCipherSuites"><code>Config.PreferServerCipherSuites</code></a>
|
||
and <a href="/pkg/crypto/tls/#Config.CipherSuites"><code>Config.CipherSuites</code></a>
|
||
or there are no other AEAD cipher suites supported.
|
||
The client is assumed not to have AES hardware support if it does not signal a
|
||
preference for AES-GCM cipher suites.
|
||
</p>
|
||
|
||
<p><!-- CL 246637 -->
|
||
<a href="/pkg/crypto/tls/#Config.Clone"><code>Config.Clone</code></a> now returns
|
||
a nil <code>*Config</code> if the source is nil, rather than panicking.
|
||
</p>
|
||
</dd>
|
||
</dl><!-- crypto/tls -->
|
||
|
||
<dl id="crypto/x509"><dt><a href="/pkg/crypto/x509/">crypto/x509</a></dt>
|
||
<dd>
|
||
<p>
|
||
The <code>GODEBUG=x509ignoreCN=0</code> flag will be removed in Go 1.17.
|
||
It enables the legacy behavior of treating the <code>CommonName</code>
|
||
field on X.509 certificates as a host name when no Subject Alternative
|
||
Names are present.
|
||
</p>
|
||
|
||
<p><!-- CL 235078 -->
|
||
<a href="/pkg/crypto/x509/#ParseCertificate">ParseCertificate</a> and
|
||
<a href="/pkg/crypto/x509/#CreateCertificate">CreateCertificate</a> both
|
||
now enforce string encoding restrictions for the fields <code>DNSNames</code>,
|
||
<code>EmailAddresses</code>, and <code>URIs</code>. These fields can only
|
||
contain strings with characters within the ASCII range.
|
||
</p>
|
||
|
||
<p><!-- CL 259697 -->
|
||
<a href="/pkg/crypto/x509/#CreateCertificate">CreateCertificate</a> now
|
||
verifies the generated certificate's signature using the signer's
|
||
public key. If the signature is invalid, an error is returned, instead
|
||
of a malformed certificate.
|
||
</p>
|
||
|
||
<p><!-- CL 233163 -->
|
||
A number of additional fields have been added to the
|
||
<a href="/pkg/crypto/x509/#CertificateRequest">CertificateRequest</a> type.
|
||
These fields are now parsed in <a href="/pkg/crypto/x509/#ParseCertificateRequest">ParseCertificateRequest</a>
|
||
and marshalled in <a href="/pkg/crypto/x509/#CreateCertificateRequest">CreateCertificateRequest</a>.
|
||
</p>
|
||
|
||
<p><!-- CL 257939 -->
|
||
DSA signature verification is no longer supported. Note that DSA signature
|
||
generation was never supported.
|
||
See <a href="https://golang.org/issue/40337">issue #40337</a>.
|
||
</p>
|
||
|
||
<p><!-- CL 257257 -->
|
||
On Windows, <a href="/pkg/crypto/x509/#Certificate.Verify"><code>Certificate.Verify</code></a>
|
||
will now return all certificate chains that are built by the platform
|
||
certificate verifier, instead of just the highest ranked chain.
|
||
</p>
|
||
|
||
<p><!-- CL 262343 -->
|
||
TODO: <a href="https://golang.org/cl/262343">https://golang.org/cl/262343</a>: add Unwrap to SystemRootsError
|
||
</p>
|
||
</dd>
|
||
</dl><!-- crypto/x509 -->
|
||
|
||
<dl id="encoding/asn1"><dt><a href="/pkg/encoding/asn1">encoding/asn1</a></dt>
|
||
<dd>
|
||
<p><!-- CL 255881 -->
|
||
<a href="/pkg/encoding/asn1/#Unmarshal">Unmarshal</a> and
|
||
<a href="/pkg/encoding/asn1/#UnmarshalWithParams">UnmarshalWithParams</a>
|
||
now return an error instead of panic when the argument is not
|
||
a pointer or is nil. This change matches the behavior of other
|
||
encoding packages such as <a href="/pkg/encoding/json">encoding/json</a>.
|
||
</p>
|
||
</dd>
|
||
</dl>
|
||
|
||
<dl id="encoding/json"><dt><a href="/pkg/encoding/json/">encoding/json</a></dt>
|
||
<dd>
|
||
<p><!-- CL 234818 -->
|
||
The <code>json</code> struct field tags understood by
|
||
<a href="/pkg/encoding/json/#Marshal"><code>Marshal</code></a>,
|
||
<a href="/pkg/encoding/json/#Unmarshal"><code>Unmarshal</code></a>,
|
||
and related functionality now permit semicolon characters within
|
||
a JSON object name for a Go struct field.
|
||
</p>
|
||
</dd>
|
||
</dl><!-- encoding/json -->
|
||
|
||
<dl id="encoding/xml"><dt><a href="/pkg/encoding/xml/">encoding/xml</a></dt>
|
||
<dd>
|
||
<p><!-- CL 264024 -->
|
||
The encoder has always taken care to avoid using namespace prefixes
|
||
beginning with <code>xml</code>, which are reserved by the XML
|
||
specification.
|
||
Now, following the specification more closely, that check is
|
||
case-insensitive, so that prefixes beginning
|
||
with <code>XML</code>, <code>XmL</code>, and so on are also
|
||
avoided.
|
||
</p>
|
||
</dd>
|
||
</dl><!-- encoding/xml -->
|
||
|
||
<dl id="flag"><dt><a href="/pkg/flag/">flag</a></dt>
|
||
<dd>
|
||
<p><!-- CL 240014 -->
|
||
The new <a href="/pkg/flag/#Func"><code>Func</code></a> function
|
||
allows registering a flag implemented by calling a function,
|
||
as a lighter-weight alternative to implementing the
|
||
<a href="/pkg/flag/#Value"><code>Value</code></a> interface.
|
||
</p>
|
||
</dd>
|
||
</dl><!-- flag -->
|
||
|
||
<dl id="io"><dt><a href="/pkg/io/">io</a></dt>
|
||
<dd>
|
||
<p><!-- CL 261577 -->
|
||
The package now defines a
|
||
<a href="/pkg/io/#ReadSeekCloser"><code>ReadSeekCloser</code></a> interface.
|
||
</p>
|
||
</dd>
|
||
</dl><!-- io -->
|
||
|
||
<dl id="log"><dt><a href="/pkg/log/">log</a></dt>
|
||
<dd>
|
||
<p><!-- CL 264460 -->
|
||
The new <a href="/pkg/log/#Default"><code>Default</code></a> function
|
||
provides access to the default <a href="/pkg/log/#Logger"><code>Logger</code></a>.
|
||
</p>
|
||
</dd>
|
||
</dl><!-- log -->
|
||
|
||
<dl id="log/syslog"><dt><a href="/pkg/log/syslog/">log/syslog</a></dt>
|
||
<dd>
|
||
<p><!-- CL 264297 -->
|
||
The <a href="/pkg/log/syslog/#Writer"><code>Writer</code></a>
|
||
now uses the local message format
|
||
(omitting the host name and using a shorter time stamp)
|
||
when logging to custom Unix domain sockets,
|
||
matching the format already used for the default log socket.
|
||
</p>
|
||
</dd>
|
||
</dl><!-- log/syslog -->
|
||
|
||
<dl id="mime/multipart"><dt><a href="/pkg/mime/multipart/">mime/multipart</a></dt>
|
||
<dd>
|
||
<p><!-- CL 247477 -->
|
||
The <a href="/pkg/mime/multipart/#Reader"><code>Reader</code></a>'s
|
||
<a href="/pkg/mime/multipart/#Reader.ReadForm"><code>ReadForm</code></a>
|
||
method no longer rejects form data
|
||
when passed the maximum int64 value as a limit.
|
||
</p>
|
||
</dd>
|
||
</dl><!-- mime/multipart -->
|
||
|
||
<dl id="net"><dt><a href="/pkg/net/">net</a></dt>
|
||
<dd>
|
||
<p><!-- CL 250357 -->
|
||
The case of I/O on a closed network connection, or I/O on a network
|
||
connection that is closed before any of the I/O completes, can now
|
||
be detected using the new <a href="/pkg/net/#ErrClosed">ErrClosed</a> error.
|
||
A typical use would be <code>errors.Is(err, net.ErrClosed)</code>.
|
||
In earlier releases the only way to reliably detect this case was to
|
||
match the string returned by the <code>Error</code> method
|
||
with <code>"use of closed network connection"</code>.
|
||
</p>
|
||
|
||
<p><!-- CL 255898 -->
|
||
In previous Go releases the default TCP listener backlog size on Linux systems,
|
||
set by <code>/proc/sys/net/core/somaxconn</code>, was limited to a maximum of <code>65535</code>.
|
||
On Linux kernel version 4.1 and above, the maximum is now <code>4294967295</code>.
|
||
</p>
|
||
|
||
<p><!-- CL 238629 -->
|
||
On Linux, host name lookups no longer use DNS before checking
|
||
<code>/etc/hosts</code> when <code>/etc/nsswitch.conf</code>
|
||
is missing; this is common on musl-based systems and makes
|
||
Go programs match the behavior of C programs on those systems.
|
||
</p>
|
||
</dd>
|
||
</dl><!-- net -->
|
||
|
||
<dl id="net/http"><dt><a href="/pkg/net/http/">net/http</a></dt>
|
||
<dd>
|
||
<p><!-- CL 233637 -->
|
||
In the <a href="/pkg/net/http/"><code>net/http</code></a> package, the
|
||
behavior of <a href="/pkg/net/http/#StripPrefix"><code>StripPrefix</code></a>
|
||
has been changed to strip the prefix from the request URL's
|
||
<code>RawPath</code> field in addition to its <code>Path</code> field.
|
||
In past releases, only the <code>Path</code> field was trimmed, and so if the
|
||
request URL contained any escaped characters the URL would be modified to
|
||
have mismatched <code>Path</code> and <code>RawPath</code> fields.
|
||
In Go 1.16, <code>StripPrefix</code> trims both fields.
|
||
If there are escaped characters in the prefix part of the request URL the
|
||
handler serves a 404 instead of its previous behavior of invoking the
|
||
underlying handler with a mismatched <code>Path</code>/<code>RawPath</code> pair.
|
||
</p>
|
||
|
||
<p><!-- CL 252497 -->
|
||
The <a href="/pkg/net/http/"><code>net/http</code></a> package now rejects HTTP range requests
|
||
of the form <code>"Range": "bytes=--N"</code> where <code>"-N"</code> is a negative suffix length, for
|
||
example <code>"Range": "bytes=--2"</code>. It now replies with a <code>416 "Range Not Satisfiable"</code> response.
|
||
</p>
|
||
|
||
<p><!-- CL 256498, golang.org/issue/36990 -->
|
||
Cookies set with <code>SameSiteDefaultMode</code> now behave according to the current
|
||
spec (no attribute is set) instead of generating a SameSite key without a value.
|
||
</p>
|
||
|
||
<p><!-- CL 246338 -->
|
||
The <a href="/pkg/net/http/"><code>net/http</code></a> package now uses the new
|
||
<a href="/pkg/crypto/tls#Conn.HandshakeContext"><code>(*tls.Conn).HandshakeContext</code></a>
|
||
with the <a href="/pkg/net/http/#Request"><code>Request</code></a> context
|
||
when performing TLS handshakes in the client or server.
|
||
</p>
|
||
|
||
<p><!-- CL 250039 -->
|
||
The <a href="/pkg/net/http/#Client">Client</a> now sends
|
||
an explicit <code>Content-Length:</code> <code>0</code>
|
||
header in <code>PATCH</code> requests with empty bodies,
|
||
matching the existing behavior of <code>POST</code> and <code>PUT</code>.
|
||
</p>
|
||
|
||
<p><!-- CL 249440 -->
|
||
The <a href="/pkg/net/http/#ProxyFromEnvironment">ProxyFromEnvironment</a> function
|
||
no longer returns the setting of the <code>HTTP_PROXY</code> environment
|
||
variable for <code>https://</code> URLs when <code>HTTPS_PROXY</code> is unset.
|
||
</p>
|
||
</dd>
|
||
</dl><!-- net/http -->
|
||
|
||
<dl id="net/http/httputil"><dt><a href="/pkg/net/http/httputil/">net/http/httputil</a></dt>
|
||
<dd>
|
||
<p><!-- CL 260637 -->
|
||
The <a href="/pkg/net/http/httputil/#ReverseProxy">ReverseProxy</a>
|
||
now flushes buffered data more aggressively when proxying
|
||
streamed responses with unknown body lengths.
|
||
</p>
|
||
</dd>
|
||
</dl><!-- net/http/httputil -->
|
||
|
||
<dl id="net/smtp"><dt><a href="/pkg/net/smtp/">net/smtp</a></dt>
|
||
<dd>
|
||
<p><!-- CL 247257 -->
|
||
The <a href="/pkg/net/smtp/#Client">Client</a>'s
|
||
<a href="/pkg/net/smtp/#Client.Mail"><code>Mail</code></a>
|
||
method now sends the <code>SMTPUTF8</code> directive to
|
||
servers that support it, signaling that addresses are encoded in UTF-8.
|
||
</p>
|
||
</dd>
|
||
</dl><!-- net/smtp -->
|
||
|
||
<dl id="os"><dt><a href="/pkg/os/">os</a></dt>
|
||
<dd>
|
||
<p><!-- CL 242998 -->
|
||
<a href="/pkg/os/#Process.Signal"><code>Process.Signal</code></a> now
|
||
returns <a href="/pkg/os/#ErrProcessDone"><code>ErrProcessDone</code></a>
|
||
instead of the unexported <code>errFinished</code> when the process has
|
||
already finished.
|
||
</p>
|
||
</dd>
|
||
</dl><!-- os -->
|
||
|
||
<dl id="os/signal"><dt><a href="/pkg/os/signal/">os/signal</a></dt>
|
||
<dd>
|
||
<p><!-- CL 219640 -->
|
||
The new
|
||
<a href="/pkg/os/signal/#NotifyContext"><code>NotifyContext</code></a>
|
||
function allows creating contexts that are canceled upon arrival of
|
||
specific signals.
|
||
</p>
|
||
</dd>
|
||
</dl><!-- os/signal -->
|
||
|
||
<dl id="path"><dt><a href="/pkg/path/">path</a></dt>
|
||
<dd>
|
||
<p><!-- CL 264397, golang.org/issues/28614 -->
|
||
The <code>Match</code> and <code>Glob</code> functions now
|
||
return an error if the unmatched part of the pattern has a
|
||
syntax error. Previously, the functions returned early on a failed
|
||
match, and thus did not report any later syntax error in the
|
||
pattern.
|
||
</p>
|
||
</dd>
|
||
</dl><!-- path -->
|
||
|
||
<dl id="path/filepath"><dt><a href="/pkg/path/filepath/">path/filepath</a></dt>
|
||
<dd>
|
||
<p><!-- CL 264397, golang.org/issues/28614 -->
|
||
The <code>Match</code> and <code>Glob</code> functions now
|
||
return an error if the unmatched part of the pattern has a
|
||
syntax error. Previously, the functions returned early on a failed
|
||
match, and thus did not report any later syntax error in the
|
||
pattern.
|
||
</p>
|
||
</dd>
|
||
</dl><!-- path/filepath -->
|
||
|
||
<dl id="reflect"><dt><a href="/pkg/reflect/">reflect</a></dt>
|
||
<dd>
|
||
<p><!-- CL 248341, golang.org/issues/40281 -->
|
||
<code>StructTag</code> now allows multiple space-separated keys
|
||
in key:value pairs, as in <code>`json xml:"field1"`</code>
|
||
(equivalent to <code>`json:"field1" xml:"field1"`</code>).
|
||
</p>
|
||
</dd>
|
||
</dl><!-- reflect -->
|
||
|
||
<dl id="runtime/debug"><dt><a href="/pkg/runtime/debug/">runtime/debug</a></dt>
|
||
<dd>
|
||
<p><!-- CL 249677 -->
|
||
The <a href="/pkg/runtime#Error"><code>runtime.Error</code> values
|
||
used when <code>SetPanicOnFault</code> is enabled may now have an
|
||
<code>Addr</code> method. If that method exists, it returns the memory
|
||
address that triggered the fault.
|
||
</p>
|
||
</dd>
|
||
</dl><!-- runtime/debug -->
|
||
|
||
<dl id="strconv"><dt><a href="/pkg/strconv/">strconv</a></dt>
|
||
<dd>
|
||
<p><!-- CL 260858 -->
|
||
<a href="/pkg/strconv/#ParseFloat"><code>ParseFloat</code></a> now uses
|
||
the <a
|
||
href="https://nigeltao.github.io/blog/2020/eisel-lemire.html">Eisel-Lemire
|
||
algorithm</a>, improving performance by up to a factor of 2. This can
|
||
also speed up decoding textual formats like <a
|
||
href="/pkg/encoding/json/"><code>encoding/json</code></a>.
|
||
</p>
|
||
</dd>
|
||
</dl><!-- strconv -->
|
||
|
||
<dl id="syscall"><dt><a href="/pkg/syscall/">syscall</a></dt>
|
||
<dd>
|
||
<p><!-- CL 263271 -->
|
||
<a href="/pkg/syscall/?GOOS=windows#NewCallback"><code>NewCallback</code></a>
|
||
and
|
||
<a href="/pkg/syscall/?GOOS=windows#NewCallbackCDecl"><code>NewCallbackCDecl</code></a>
|
||
now correctly support callback functions with multiple
|
||
sub-<code>uintptr</code>-sized arguments in a row. This may
|
||
require changing uses of these functions to eliminate manual
|
||
padding between small arguments.
|
||
</p>
|
||
|
||
<p><!-- CL 261917 -->
|
||
<a href="/pkg/syscall/?GOOS=windows#SysProcAttr"><code>SysProcAttr</code></a> on Windows has a new NoInheritHandles field that disables inheriting handles when creating a new process.
|
||
</p>
|
||
|
||
<p><!-- CL 269761, golang.org/issue/42584 -->
|
||
<a href="/pkg/syscall/?GOOS=windows#DLLError"><code>DLLError</code></a> on Windows now has an Unwrap function for unwrapping its underlying error.
|
||
</p>
|
||
|
||
<p><!-- CL 210639 -->
|
||
On Linux,
|
||
<a href="/pkg/syscall/#Setgid"><code>Setgid</code></a>,
|
||
<a href="/pkg/syscall/#Setuid"><code>Setuid</code></a>,
|
||
and related calls are now implemented.
|
||
Previously, they returned an <code>syscall.EOPNOTSUPP</code> error.
|
||
</p>
|
||
</dd>
|
||
</dl><!-- syscall -->
|
||
|
||
<dl id="text/template"><dt><a href="/pkg/text/template/">text/template</a></dt>
|
||
<dd>
|
||
<p><!-- CL 254257, golang.org/issue/29770 -->
|
||
Newlines characters are now allowed inside action delimiters,
|
||
permitting actions to span multiple lines.
|
||
</p>
|
||
</dd>
|
||
</dl><!-- text/template -->
|
||
|
||
<dl id="text/template/parse"><dt><a href="/pkg/text/template/parse/">text/template/parse</a></dt>
|
||
<dd>
|
||
<p><!-- CL 229398, golang.org/issue/34652 -->
|
||
A new <a href="/pkg/text/template/parse/#CommentNode"><code>CommentNode</code></a>
|
||
was added to the parse tree. The <a href="/pkg/text/template/parse/#Mode"><code>Mode</code></a>
|
||
field in the <code>parse.Tree</code> enables access to it.
|
||
</p>
|
||
</dd>
|
||
</dl><!-- text/template/parse -->
|
||
|
||
<dl id="time/tzdata"><dt><a href="/pkg/time/tzdata/">time/tzdata</a></dt>
|
||
<dd>
|
||
<p><!-- CL 261877 -->
|
||
The slim timezone data format is now used for the timezone database in
|
||
<code>$GOROOT/lib/time/zoneinfo.zip</code> and the embedded copy in this
|
||
package. This reduces the size of the timezone database by about 350 KB.
|
||
</p>
|
||
</dd>
|
||
</dl><!-- time/tzdata -->
|
||
|
||
<dl id="unicode"><dt><a href="/pkg/unicode/">unicode</a></dt>
|
||
<dd>
|
||
<p><!-- CL 248765 -->
|
||
The <a href="/pkg/unicode/"><code>unicode</code></a> package and associated
|
||
support throughout the system has been upgraded from Unicode 12.0.0 to
|
||
<a href="https://www.unicode.org/versions/Unicode13.0.0/">Unicode 13.0.0</a>,
|
||
which adds 5,930 new characters, including four new scripts, and 55 new emoji.
|
||
Unicode 13.0.0 also designates plane 3 (U+30000-U+3FFFF) as the tertiary
|
||
ideographic plane.
|
||
</p>
|
||
</dd>
|
||
</dl><!-- unicode -->
|