mirror of
https://github.com/golang/go
synced 2024-11-08 19:26:14 -07:00
6362d01c15
benchstat v2 comparison vs HEAD: 1.15.6 1.16 sec/op sec/op vs base LinkIstio-48 4.44 ± 1% 3.43 ± 1% -22.79% (p=0.000 n=20) LinkKubelet-48 10.89 ± 1% 8.42 ± 1% -22.63% (p=0.000 n=20) LinkDiscovery-48 1.43 ± 1% 1.06 ± 1% -25.68% (p=0.000 n=20) LinkIstio-4 4.50 ± 1% 3.52 ± 1% -21.84% (p=0.000 n=20) LinkKubelet-4 10.84 ± 2% 8.55 ± 1% -21.09% (p=0.000 n=20) LinkDiscovery-4 1.45 ± 2% 1.11 ± 2% -23.81% (p=0.000 n=20) 1.15.6 1.16 max-RSS-bytes max-RSS-bytes vs base LinkIstio-48 1085Mi ± 1% 1006Mi ± 0% -7.32% (p=0.000 n=20) LinkKubelet-48 1.60Gi ± 5% 1.46Gi ± 1% -8.57% (p=0.000 n=20) LinkDiscovery-48 392Mi ± 1% 362Mi ± 2% -7.71% (p=0.000 n=20) LinkIstio-4 1022Mi ± 6% 958Mi ± 1% -6.26% (p=0.000 n=20) LinkKubelet-4 1.63Gi ± 2% 1.44Gi ± 0% -11.44% (p=0.000 n=20) LinkDiscovery-4 400Mi ± 0% 353Mi ± 1% -11.83% (p=0.000 n=20) 1.15.6 1.16 exe-bytes exe-bytes vs base LinkIstio-48 97.7Mi ± 0% 93.4Mi ± 0% -4.38% (p=0.000 n=20) LinkKubelet-48 129Mi ± 0% 127Mi ± 0% -1.17% (p=0.000 n=20) LinkDiscovery-48 31.9Mi ± 0% 29.1Mi ± 0% -8.67% (p=0.000 n=20) LinkIstio-4 97.7Mi ± 0% 93.4Mi ± 0% -4.38% (p=0.000 n=20) LinkKubelet-4 129Mi ± 0% 127Mi ± 0% -1.17% (p=0.000 n=20) LinkDiscovery-4 31.9Mi ± 0% 29.1Mi ± 0% -8.67% (p=0.000 n=20) https://perf.golang.org/search?q=upload:20201207.6 For #40700. Change-Id: I3f7b3e08db4fb7980d2472f15e5fc04503e95ea0 Reviewed-on: https://go-review.googlesource.com/c/go/+/275912 Trust: Austin Clements <austin@google.com> Reviewed-by: Cherry Zhang <cherryyz@google.com>
905 lines
36 KiB
HTML
905 lines
36 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>
|
||
There are no changes to the language.
|
||
</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="openbsd">OpenBSD</h3>
|
||
|
||
<p><!-- golang.org/issue/40995 -->
|
||
Go now supports the MIPS64 architecture on OpenBSD
|
||
(the <code>openbsd/mips64</code> port). This port does not yet
|
||
support cgo.
|
||
</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>
|
||
|
||
<h3 id="riscv">RISC-V</h3>
|
||
|
||
<p><!-- golang.org/issue/36641, CL 267317 -->
|
||
The <code>linux/riscv64</code> port now supports cgo and
|
||
<code>-buildmode=pie</code>. This release also includes performance
|
||
optimizations and code generation improvements for RISC-V.
|
||
</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 bypasses 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-25% 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. Most binaries are
|
||
also smaller as a result of more aggressive symbol pruning.
|
||
</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"><code>New</code></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"><code>net.ErrClosed</code></a>
|
||
error. A typical use would be <code>errors.Is(err, net.ErrClosed)</code>.
|
||
</p>
|
||
|
||
<p><!-- CL 266037 -->
|
||
A default write deadline is now set in
|
||
<a href="/pkg/crypto/tls/#Conn.Close"><code>Conn.Close</code></a>
|
||
before sending the "close notify" alert, in order to prevent blocking
|
||
indefinitely.
|
||
</p>
|
||
|
||
<p><!-- CL 246338 -->
|
||
The new <a href="/pkg/crypto/tls#Conn.HandshakeContext"><code>Conn.HandshakeContext</code></a>
|
||
method allows cancellation of an in-progress handshake. The provided
|
||
context is accessible through the new
|
||
<a href="/pkg/crypto/tls#ClientHelloInfo.Context"><code>ClientHelloInfo.Context</code></a>
|
||
and <a href="/pkg/crypto/tls#CertificateRequestInfo.Context">
|
||
<code>CertificateRequestInfo.Context</code></a> methods. Canceling the
|
||
context after the handshake has finished has no effect.
|
||
</p>
|
||
|
||
<p><!-- CL 239748 -->
|
||
Clients now return a handshake error if the server selects
|
||
<a href="/pkg/crypto/tls/#ConnectionState.NegotiatedProtocol">
|
||
an ALPN protocol</a> that was not in
|
||
<a href="/pkg/crypto/tls/#Config.NextProtos">
|
||
the list advertised by the client</a>.
|
||
</p>
|
||
|
||
<p><!-- CL 262857 -->
|
||
Servers will now prefer other available AEAD cipher suites (such as ChaCha20Poly1305)
|
||
over AES-GCM cipher suites if either the client or server doesn't have AES hardware
|
||
support, unless 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>
|
||
are set. 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 nil if the receiver 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"><code>ParseCertificate</code></a> and
|
||
<a href="/pkg/crypto/x509/#CreateCertificate"><code>CreateCertificate</code></a>
|
||
now enforce string encoding restrictions for the <code>DNSNames</code>,
|
||
<code>EmailAddresses</code>, and <code>URIs</code> fields. These fields
|
||
can only contain strings with characters within the ASCII range.
|
||
</p>
|
||
|
||
<p><!-- CL 259697 -->
|
||
<a href="/pkg/crypto/x509/#CreateCertificate"><code>CreateCertificate</code></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"><code>CertificateRequest</code></a> type.
|
||
These fields are now parsed in <a href="/pkg/crypto/x509/#ParseCertificateRequest">
|
||
<code>ParseCertificateRequest</code></a> and marshalled in
|
||
<a href="/pkg/crypto/x509/#CreateCertificateRequest"><code>CreateCertificateRequest</code></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 -->
|
||
The new <a href="/pkg/crypto/x509/#SystemRootsError.Unwrap"><code>SystemRootsError.Unwrap</code></a>
|
||
method allows accessing the <a href="/pkg/crypto/x509/#SystemRootsError.Err"><code>Err</code></a>
|
||
field through the <a href="/pkg/errors"><code>errors</code></a> package functions.
|
||
</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"><code>Unmarshal</code></a> and
|
||
<a href="/pkg/encoding/asn1/#UnmarshalWithParams"><code>UnmarshalWithParams</code></a>
|
||
now return an error instead of panicking 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"><code>encoding/json</code></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 <a href="/pkg/net/http/#SameSiteDefaultMode"><code>SameSiteDefaultMode</code></a>
|
||
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 passes the
|
||
<a href="/pkg/net/http/#Request.Context"><code>Request</code> context</a> to
|
||
<a href="/pkg/crypto/tls#Conn.HandshakeContext"><code>tls.Conn.HandshakeContext</code></a>
|
||
when performing TLS handshakes.
|
||
</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></a> 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 -->
|