blob: d8e6a817448c6d6676a9dba5e8e68a01254d0d8a [file] [log] [blame]
<!--{
"Title": "Go 1.20 Release Notes",
"Path": "/doc/go1.20"
}-->
<!--
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.20</h2>
<p>
<strong>
Go 1.20 is not yet released. These are work-in-progress
release notes. Go 1.20 is expected to be released in February 2023.
</strong>
</p>
<h2 id="language">Changes to the language</h2>
<p>
Go 1.20 includes three changes to the language.
</p>
<p><!-- https://go.dev/issue/46505 -->
Go 1.17 added <a href="/ref/spec#Conversions_from_slice_to_array_pointer">conversions from slice to an array pointer</a>.
Go 1.20 extends this to allow conversions from a slice to an array:
given a slice <code>x</code>, <code>[4]byte(x)</code> can now be written
instead of <code>*(*[4]byte)(x)</code>.
</p>
<p><!-- https://go.dev/issue/53003 -->
The <a href="/ref/spec/#Package_unsafe"><code>unsafe</code> package</a> defines
three new functions <code>SliceData</code>, <code>String</code>, and <code>StringData</code>.
Along with Go 1.17's <code>Slice</code>, these functions now provide the complete ability to
construct and deconstruct slice and string values, without depending on their exact representation.
</p>
<p><!-- https://go.dev/issue/8606 -->
The specification now defines that struct values are compared one field at a time,
considering fields in the order they appear in the struct type definition,
and stopping at the first mismatch.
The specification could previously have been read as if
all fields needed to be compared beyond the first mismatch.
Similarly, the specification now defines that array values are compared
one element at a time, in increasing index order.
In both cases, the difference affects whether certain comparisons must panic.
Existing programs are unchanged: the new spec wording describes
what the implementations have always done.
</p>
<h2 id="ports">Ports</h2>
<h3 id="freebsd-riscv">FreeBSD/RISC-V</h3>
<p><!-- https://go.dev/issue/53466 -->
Go 1.20 adds experimental support for FreeBSD on RISC-V (<code>GOOS=freebsd</code>, <code>GOARCH=riscv64</code>).
</p>
<h2 id="tools">Tools</h2>
<h3 id="go-command">Go command</h3>
<p><!-- CL 432535: cmd/go: don't install most GOROOT .a files in pkg -->
The directory <code>$GOROOT/pkg</code> no longer stores
pre-compiled package archives for the standard library:
<code>go</code> <code>install</code> no longer writes them,
the <code>go</code> build no longer checks for them,
and the Go distribution no longer ships them.
Instead, packages in the standard library are built as needed
and cached in the build cache, just like packages outside <code>GOROOT</code>.
This change reduces the size of the Go distribution and also
avoids C toolchain skew for packages that use cgo.
</p>
<p><!-- CL 448357: cmd/go: print test2json start events -->
The implementation of <code>go</code> <code>test</code> <code>-json</code>
has been improved to make it more robust.
Programs that run <code>go</code> <code>test</code> <code>-json</code>
do not need any updates.
Programs that invoke <code>go</code> <code>tool</code> <code>test2json</code>
directly should now run the test binary with <code>-v=json</code>
(for example, <code>go</code> <code>test</code> <code>-v=json</code>
or <code>./pkg.test</code> <code>-test.v=json</code>)
instead of plain <code>-v</code>.
</p>
<p><!-- CL 448357: cmd/go: print test2json start events -->
A related change to <code>go</code> <code>test</code> <code>-json</code>
is the addition of an event with <code>Action</code> set to <code>start</code>
at the beginning of each test program's execution.
When running multiple tests using the <code>go</code> command,
these start events are guaranteed to be emitted in the same order as
the packages named on the command line.
</p>
<p><!-- https://go.dev/issue/45454 --><!-- CL 421434 -->
The <code>go</code> command now defines
architecture feature build tags, such as <code>amd64.v2</code>,
to allow selecting a package implementation file based on the presence
or absence of a particular architecture feature.
See <a href="/cmd/go#hdr-Build_constraints"><code>go</code> <code>help</code> <code>buildconstraint</code></a> for details.
</p>
<p><!-- https://go.dev/issue/50332 -->
The <code>go</code> subcommands now accept
<code>-C</code> <code>&lt;dir&gt;</code> to change directory to &lt;dir&gt;
before performing the command, which may be useful for scripts that need to
execute commands in multiple different modules.
</p>
<p><!-- https://go.dev/issue/41696, CL 416094 -->
The <code>go</code> <code>build</code> and <code>go</code> <code>test</code>
commands no longer accept the <code>-i</code> flag,
which has been <a href="https://go.dev/issue/41696">deprecated since Go 1.16</a>.
</p>
<p><!-- https://go.dev/issue/38687, CL 421440 -->
The <code>go</code> <code>generate</code> command now accepts
<code>-skip</code> <code>&lt;pattern&gt;</code> to skip <code>//go:generate</code> directives
matching <code>&lt;pattern&gt;</code>.
</p>
<p><!-- https://go.dev/issue/41583 -->
The <code>go</code> <code>test</code> command now accepts
<code>-skip</code> <code>&lt;pattern&gt;</code> to skip tests, subtests, or examples
matching <code>&lt;pattern&gt;</code>.
</p>
<p><!-- https://go.dev/issue/37015 -->
When the main module is located within <code>GOPATH/src</code>,
<code>go</code> <code>install</code> no longer installs libraries for
non-<code>main</code> packages to <code>GOPATH/pkg</code>,
and <code>go</code> <code>list</code> no longer reports a <code>Target</code>
field for such packages. (In module mode, compiled packages are stored in the
<a href="https://pkg.go.dev/cmd/go#hdr-Build_and_test_caching">build cache</a>
only, but <a href="https://go.dev/issue/37015">a bug</a> had caused
the <code>GOPATH</code> install targets to unexpectedly remain in effect.)
</p>
<h4 id="go-version"><code>go</code> <code>version</code></h4>
<p><!-- https://go.dev/issue/48187 -->
The <code>go</code> <code>version</code> <code>-m</code> command
now supports reading more types of Go binaries, most notably, Windows DLLs
built with <code>go</code> <code>build</code> <code>-buildmode=c-shared</code>
and Linux binaries without execute permission.
</p>
<h3 id="cgo">Cgo</h3>
<p>
The <code>go</code> command now disables <code>cgo</code> by default
on systems without a C toolchain.
More specifically, when the <code>CGO_ENABLED</code> environment variable is unset,
the <code>CC</code> environment variable is unset,
and the default C compiler (typically <code>clang</code> or <code>gcc</code>)
is not found in the path,
<code>CGO_ENABLED</code> defaults to <code>0</code>.
As always, you can override the default by setting <code>CGO_ENABLED</code> explicitly.
</p>
<p>
The most important effect of the default change is that when Go is installed
on a system without a C compiler, it will now use pure Go builds for packages
in the standard library that use cgo, instead of using pre-distributed package archives
(which have been removed, as <a href="#go-command">noted above</a>)
or attempting to use cgo and failing.
This makes Go work better in some minimal container environments
as well as on macOS, where pre-distributed package archives have
not been used for cgo-based packages since Go 1.16.
</p>
<p>
The packages in the standard library that use cgo are <a href="/pkg/net/">net</a>,
<a href="/pkg/os/user/">os/user</a>, and
<a href="/pkg/plugin/">plugin</a>.
On macOS, the net and os/user packages have been rewritten not to use cgo:
the same code is now used for cgo and non-cgo builds as well as cross-compiled builds.
On Windows, the net and os/user packages have never used cgo.
On other systems, builds with cgo disabled will use a pure Go version of these packages.
</p>
<p>
On macOS, the race detector has been rewritten not to use cgo:
race-detector-enabled programs can be built and run without Xcode.
On Linux and other Unix systems, and on Windows, a host C toolchain
is required to use the race detector.
</p>
<h3 id="cover">Cover</h3>
<p><!-- CL 436236, CL 401236, CL 438503 -->
TODO coverage
</p>
<h3 id="vet">Vet</h3>
<h4 id="vet-loopclosure">Improved detection of loop variable capture by nested functions</h4>
<p><!-- CL 447256 --><!-- https://go.dev/issue/55972: extend the loopclosure analysis to parallel subtests -->
The <code>vet</code> tool now reports references to loop variables following
a call to <a href="/pkg/testing/#T.Parallel"><code>T.Parallel()</code></a>
within subtest function bodies. Such references may observe the value of the
variable from a different iteration (typically causing test cases to be
skipped) or an invalid state due to unsynchronized concurrent access.
</p>
<p><!-- CL 452615 -->
The tool also detects reference mistakes in more places. Previously it would
only consider the last statement of the loop body, but now it recursively
inspects the last statements within if, switch, and select statements.
</p>
<h4 id="vet-timeformat">New diagnostic for incorrect time formats</h4>
<p><!-- CL 354010 --><!-- https://go.dev/issue/48801: check for time formats with 2006-02-01 -->
The vet tool now reports use of the time format 2006-02-01 (yyyy-dd-mm)
with <a href="/pkg/time/#Time.Format"><code>Time.Format</code></a> and
<a href="/pkg/time/#Parse"><code>time.Parse</code></a>.
This format does not appear in common date standards, but is frequently
used by mistake when attempting to use the ISO 8601 date format
(yyyy-mm-dd).
</p>
<h2 id="runtime">Runtime</h2>
<p>
TODO: complete this section, or delete if not needed
</p>
<h2 id="compiler">Compiler</h2>
<p><!-- https://go.dev/issue/49390 -->
TODO: <a href="https://go.dev/issue/49390">https://go.dev/issue/49390</a>: clarify whether "-l" and "-N" compiler flags are actually supported
</p>
<h2 id="linker">Linker</h2>
<p>
TODO: complete this section, or delete if not needed
</p>
<h2 id="bootstrap">Bootstrap</h2>
<p><!-- https://go.dev/issue/44505 -->
When building a Go release from source and GOROOT_BOOTSTRAP is not set,
previous versions of Go looked for a Go 1.4 or later bootstrap toolchain in the directory $HOME/go1.4 (%HOMEDRIVE%%HOMEPATH%\go1.4 on Windows).
Go 1.18 and Go 1.19 looked first for $HOME/go1.17 or $HOME/sdk/go1.17 before falling back to $HOME/go1.4,
in ancitipation of requiring Go 1.17 for use when bootstrapping Go 1.20.
Go 1.20 does require a Go 1.17 release for bootstrapping, but we realized that we should
adopt the latest point release of the bootstrap toolchain, so it requires Go 1.17.13.
Go 1.20 looks for $HOME/go1.17.13 or $HOME/sdk/go1.17.13 before falling back to $HOME/go1.4
(to support systems that hard-coded the path $HOME/go1.4 but have installed
a newer Go toolchain there).
In the future, we plan to move the bootstrap toolchain forward approximately once a year,
and in particular we expect that Go 1.22 will require the final point release of Go 1.20 for bootstrap.
</p>
<h2 id="library">Core library</h2>
<h3 id="crypto/ecdh">New <code>crypto/ecdh</code> package</h3>
<p><!-- https://go.dev/issue/52221, CL 398914 -->
TODO: complete this section
</p>
<h3 id="errors">Wrapping multiple errors</h3>
<p><!-- CL 432898 -->
Go 1.20 expands support for error wrapping to permit an error to
wrap multiple other errors.
</p>
<p>
An error <code>e</code</e> can wrap more than one error by providing
an <code>Unwrap</code> method that returns a <code>[]error</code>.
</p>
<p>
The <a href="/pkg/errors/#Is"><code>errors.Is</code></a> and
<a href="/pkg/errors/#As"><code>errors.As</code></a> functions
have been updated to inspect multiply wrapped errors.
</p>
<p>
The <a href="/pkg/fmt/#Errorf"><code>fmt.Errorf</code></a> function
now supports multiple occurrances of the <code>%w</code> format verb,
which will cause it to return an error that wraps all of those error operands.
</p>
<p>
The new function <a href="/pkg/errors/#Join"><code>errors.Join</code></a>
returns an error wrapping a list of errors.
</p>
<h3 id="http_responsecontroller">HTTP ResponseController</h3>
<p>
The new
<a href="/pkg/net/http/#ResponseController"><code>"net/http".ResponseController</code></a>
type provides access to extended per-request functionality not handled by the
<a href="/pkg/net/http/#ResponseWriter"><code>"net/http".ResponseWriter</code></a> interface.
</p>
<p>
Previously, we have added new per-request functionality by defining optional
interfaces which a <code>ResponseWriter</code> can implement, such as
<a href="/pkg/net/http/#Flusher"><code>Flusher<code></a>. These interfaces
are not discoverable and clumsy to use.
</p>
<p>
The <code>ResponseController</code> type provides a clearer, more discoverable way
to add per-handler controls. Two such controls also added in Go 1.20 are
<code>SetReadDeadline</code> and <code>SetWriteDeadline</code>, which allow setting
per-request read and write deadlines. For example:
</p>
<pre>
func RequestHandler(w ResponseWriter, r *Request) {
rc := http.NewResponseController(w)
rc.SetWriteDeadline(0) // disable Server.WriteTimeout when sending a large response
io.Copy(w, bigData)
}
</pre>
<h3 id="reverseproxy_rewrite">New ReverseProxy Rewrite hook</h3>
<p><!-- https://go.dev/issue/53002 -->
The <a href="/pkg/net/http/httputil/#ReverseProxy"><code>httputil.ReverseProxy</code></a>
forwarding proxy includes a new <code>Rewrite</code> hook function, superseding the
previous <code>Director</code> hook.
</p>
<p>
The <code>Rewrite</code> hook accepts a
<a href="/pkg/net/http/httputil/#ProxyRequest"><code>ProxyRequest</code></a> parameter,
which includes both the inbound request received by the proxy and the outbound
request that it will send.
Unlike <code>Director</code> hooks, which only operate on the outbound request,
this permits <code>Rewrite</code> hooks to avoid certain scenarios where
a malicious inbound request may cause headers added by the hook
to be removed before forwarding.
See <a href="https://go.dev/issue/50580">issue #50580</a>.
</p>
<p>
The <a href="/pkg/net/http/httputil/#ProxyRequest.SetURL"><code>ProxyRequest.SetURL</code></a>
method routes the outbound request to a provided destination
and supersedes the <code>NewSingleHostReverseProxy</code> function.
Unlike <code>NewSingleHostReverseProxy</code>, <code>SetURL</code>
also sets the <code>Host</code> header of the outbound request.
</p>
<p><!-- https://go.dev/issue/50465 -->
The
<a href="/pkg/net/http/httputil/#ProxyRequest.SetXForwarded"><code>ProxyRequest.SetXForwarded</code></a>
method sets the <code>X-Forwarded-For</code>, <code>X-Forwarded-Host</code>,
and <code>X-Forwarded-Proto</code> headers of the outbound request.
When using a <code>Rewrite</code>, these headers are not added by default.
</p>
<p>
An example of a <code>Rewrite</code> hook using these features is:
</p>
<pre>
proxyHandler := &httputil.ReverseProxy{
Rewrite: func(r *httputil.ProxyRequest) {
r.SetURL(outboundURL) // Forward request to outboundURL.
r.SetXForwarded() // Set X-Forwarded-* headers.
r.Out.Header.Set("X-Additional-Header", "header set by the proxy")
},
}
</pre>
<p><!-- CL 407375 -->
<a href="/pkg/net/http/httputil/#ReverseProxy"><code>ReverseProxy</code></a> no longer adds a <code>User-Agent</code> header
to forwarded requests when the incoming request does not have one.
</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.
There are also various performance improvements, not enumerated here.
</p>
<p>
TODO: complete this section
</p>
<dl id="archive/tar"><dt><a href="/pkg/archive/tar/">archive/tar</a></dt>
<dd>
<p><!-- https://go.dev/issue/55356 -->
When the <code>GODEBUG=tarinsecurepath=0</code> environment variable is set,
<a href="/pkg/archive/tar/#Reader.Next"><code>Reader.Next</code></a> method
will now return the error <a href="/pkg/archive/tar/#ErrInsecurePath"><code>ErrInsecurePath</code></a>
for an entry with a file name that is an absolute path,
refers to a location outside the current directory, contains invalid
characters, or (on Windows) is a reserved name such as <code>NUL</code>.
A future version of Go may disable insecure paths by default.
</p>
</dd>
</dl><!-- archive/tar -->
<dl id="archive/zip"><dt><a href="/pkg/archive/zip/">archive/zip</a></dt>
<dd>
<p><!-- https://go.dev/issue/55356 -->
When the <code>GODEBUG=zipinsecurepath=0</code> environment variable is set,
<a href="/pkg/archive/zip/#NewReader"><code>NewReader</code></a> will now return the error
<a href="/pkg/archive/zip/#ErrInsecurePath"><code>ErrInsecurePath</code></a>
when opening an archive which contains any file name that is an absolute path,
refers to a location outside the current directory, contains invalid
characters, or (on Windows) is a reserved names such as <code>NUL</code>.
A future version of Go may disable insecure paths by default.
</p>
<p><!-- CL 449955 -->
Reading from a directory file that contains file data will now return an error.
The zip specification does not permit directory files to contain file data,
so this change only affects reading from invalid archives.
</p>
</dd>
</dl><!-- archive/zip -->
<dl id="bytes"><dt><a href="/pkg/bytes/">bytes</a></dt>
<dd>
<p><!-- CL 407176 -->
The new
<a href="/pkg/bytes/#CutPrefix"><code>CutPrefix</code></a> and
<a href="/pkg/bytes/#CutSuffix"><code>CutSuffix</code></a> functions
are like <a href="/pkg/bytes/#TrimPrefix"><code>TrimPrefix</code></a>
and <a href="/pkg/bytes/#TrimSuffix"><code>TrimSuffix</code></a>
but also report whether the string was trimmed.
</p>
<p><!-- CL 359675 -->
The new <a href="/pkg/bytes/#Clone"><code>Clone</code></a> function
allocates a copy of a byte slice.
</p>
</dd>
</dl><!-- bytes -->
<dl id="context"><dt><a href="/pkg/context/">context</a></dt>
<dd>
<p><!-- https://go.dev/issue/51365 --><!-- CL 375977 -->
TODO: <a href="https://go.dev/cl/375977">https://go.dev/cl/375977</a>: context: add APIs for writing and reading cancelation cause; modified api/next/51365.txt
</p>
</dd>
</dl><!-- context -->
<dl id="crypto/ed25519"><dt><a href="/pkg/crypto/ed25519/">crypto/ed25519</a></dt>
<dd>
<p><!-- CL 373076 -->
TODO: <a href="https://go.dev/cl/373076">https://go.dev/cl/373076</a>: crypto/ed25519: implement Ed25519ph in Sign and VerifyWithOptions; modified api/next/31804.txt
</p>
</dd>
</dl><!-- crypto/ed25519 -->
<dl id="crypto/elliptic"><dt><a href="/pkg/crypto/elliptic/">crypto/elliptic</a></dt>
<dd>
<p><!-- https://go.dev/issue/34648 -->
TODO: <a href="https://go.dev/issue/34648">https://go.dev/issue/34648</a>: automatically upgrade CurveParams for known curves and deprecate custom ones
</p>
</dd>
</dl><!-- crypto/elliptic -->
<dl id="crypto/rsa"><dt><a href="/pkg/crypto/rsa/">crypto/rsa</a></dt>
<dd>
<p><!-- CL 418874 --><!-- https://go.dev/issue/19974 -->
TODO: <a href="https://go.dev/issue/19974">https://go.dev/issue/19974</a>: allow hash.Hash for OAEP and MGF1 to be specified independently
</p>
</dd>
</dl><!-- crypto/rsa -->
<dl id="crypto/subtle"><dt><a href="/pkg/crypto/subtle/">crypto/subtle</a></dt>
<dd>
<p><!-- https://go.dev/issue/53021 -->
TODO: <a href="https://go.dev/issue/53021">https://go.dev/issue/53021</a>: add XORBytes
</p>
<p><!-- CL 421435 -->
TODO: <a href="https://go.dev/cl/421435">https://go.dev/cl/421435</a>: crypto/subtle: add XORBytes; modified api/next/53021.txt
</p>
</dd>
</dl><!-- crypto/subtle -->
<dl id="crypto/tls"><dt><a href="/pkg/crypto/tls/">crypto/tls</a></dt>
<dd>
<p><!-- CL 426455 -->
TODO: <a href="https://go.dev/cl/426455">https://go.dev/cl/426455</a>: crypto/tls: use certificate cache in client
</p>
</dd>
</dl><!-- crypto/tls -->
<dl id="debug/elf"><dt><a href="/pkg/debug/elf/">debug/elf</a></dt>
<dd>
<p><!-- CL 420982 -->
TODO: <a href="https://go.dev/cl/420982">https://go.dev/cl/420982</a>: debug/elf: add new-style LoongArch reloc types; modified api/next/54222.txt
</p>
<p><!-- CL 411915 -->
TODO: <a href="https://go.dev/cl/411915">https://go.dev/cl/411915</a>: debug/elf: fix reloc number of R_PPC64_SECTOFF_LO_DS; modified api/except.txt, api/next/53356.txt
</p>
<p><!-- CL 425555 -->
TODO: <a href="https://go.dev/cl/425555">https://go.dev/cl/425555</a>: debug/elf: define additional PPC64 ELFv2 relocations; modified api/next/54345.txt
</p>
<p><!-- CL 429601 -->
TODO: <a href="https://go.dev/cl/429601">https://go.dev/cl/429601</a>: debug/elf: return error on reading from SHT_NOBITS sections
</p>
<p><!-- CL 435415 -->
TODO: <a href="https://go.dev/cl/435415">https://go.dev/cl/435415</a>: debug/elf: fix typo in R_PPC64_TPREL34 and R_PPC64_DTPREL34; modified api/next/54345.txt
</p>
</dd>
</dl><!-- debug/elf -->
<dl id="debug/pe"><dt><a href="/pkg/debug/pe/">debug/pe</a></dt>
<dd>
<p><!-- CL 421357 -->
TODO: <a href="https://go.dev/cl/421357">https://go.dev/cl/421357</a>: debug/pe: add IMAGE_FILE_MACHINE_RISCV{32,64,128}; modified api/next/54251.txt
</p>
</dd>
</dl><!-- debug/pe -->
<dl id="encoding/binary"><dt><a href="/pkg/encoding/binary/">encoding/binary</a></dt>
<dd>
<p><!-- CL 420274 -->
The <a href="/pkg/encoding/binary/#ReadVarint"><code>ReadVarint</code></a> and
<a href="/pkg/encoding/binary/#ReadUvarint"><code>ReadUvarint</code></a>
functions will now return <code>io.ErrUnexpectedEOF</code> after reading a partial value,
rather than <code>io.EOF</code>.
</p>
</dd>
</dl><!-- encoding/binary -->
<dl id="encoding/xml"><dt><a href="/pkg/encoding/xml/">encoding/xml</a></dt>
<dd>
<p><!-- https://go.dev/issue/53346 --><!-- CL 424777 -->
The new <a href="/pkg/encoding/xml/#Encoder.Close"><code>Encoder.Close</code></a> method
can be used to check for unclosed elements when finished encoding.
</p>
<p><!-- CL 103875 --><!-- CL 105636 -->
The decoder now rejects element and attribute names with more than one colon,
such as <code>&lt;a:b:c&gt;</code>,
as well as namespaces that resolve to an empty string, such as <code>xmlns:a=""</code>.
</p>
<p><!-- CL 107255 -->
The decoder now rejects elements that use different namespace prefixes in the opening and closing tag,
even if those prefixes both denote the same namespace.
</p>
</dd>
</dl><!-- encoding/xml -->
<dl id="errors"><dt><a href="/pkg/errors/">errors</a></dt>
<dd>
<p><!-- https://go.dev/issue/53435 -->
The new <a href="/pkg/errors/#Join"><code>Join</code></a> function returns an error wrapping a list of errors.
</p>
</dd>
</dl><!-- errors -->
<dl id="fmt"><dt><a href="/pkg/fmt/">fmt</a></dt>
<dd>
<p><!-- https://go.dev/issue/53435 -->
The <a href="/pkg/fmt/#Errorf"><code>Errorf</code></a> function supports multiple occurrences of
the <code>%w</code> format verb, returning an error that unwraps to the list of all arguments to <code>%w</code>.
</p>
<p><!-- https://go.dev/issue/51668 --><!-- CL 400875 -->
The new <a href="/pkg/fmt/#FormatString"><code>FormatString</code></a> function recovers the
formatting directive corresponding to a <a href="/pkg/fmt/#State"><code>State</code></a>,
which can be useful in <a href="/pkg/fmt/#Formatter"><code>Formatter</code></a>.
implementations.
</p>
</dd>
</dl><!-- fmt -->
<dl id="go/ast"><dt><a href="/pkg/go/ast/">go/ast</a></dt>
<dd>
<p><!-- CL 426091 -->
TODO: <a href="https://go.dev/cl/426091">https://go.dev/cl/426091</a>: go/ast: add Range token.Pos to RangeStmt
</p>
<p><!-- CL 427955 -->
TODO: <a href="https://go.dev/cl/427955">https://go.dev/cl/427955</a>: go/ast: record start and end of file in File.File{Start,End}; modified api/next/53202.txt
</p>
</dd>
</dl><!-- go/ast -->
<dl id="go/token"><dt><a href="/pkg/go/token/">go/token</a></dt>
<dd>
<p><!-- CL 410114 -->
TODO: <a href="https://go.dev/cl/410114">https://go.dev/cl/410114</a>: go/token: add (*FileSet).RemoveFile(*File) method
</p>
</dd>
</dl><!-- go/token -->
<dl id="io"><dt><a href="/pkg/io/">io</a></dt>
<dd>
<p><!-- https://go.dev/issue/45899 --><!-- CL 406776 -->
The new <a href="/pkg/io/#OffsetWriter"><code>OffsetWriter</code></a> wraps an underlying
<a href="/pkg/io/#WriterAt"><code>WriterAt</code></a>
and provides <code>Seek</code>, <code>Write</code>, and <code>WriteAt</code> methods
that adjust their effective file offset position by a fixed amount.
</p>
</dd>
</dl><!-- io -->
<dl id="io/fs"><dt><a href="/pkg/io/fs/">io/fs</a></dt>
<dd>
<p><!-- CL 363814 --><!-- https://go.dev/issue/47209 -->
The new error <a href="/pkg/io/fs/#SkipAll"><code>SkipAll</code></a>
terminates a <a href="/pkg/io/fs/#WalkDir"><code>WalkDir</code></a>
immediately but successfully.
</p>
</dd>
</dl><!-- io -->
<dl id="math/rand"><dt><a href="/pkg/math/rand/">math/rand</a></dt>
<dd>
<p><!-- https://go.dev/issue/54880 --><!-- CL 436955 -->
The <a href="/pkg/math/rand/">math/rand</a> package now automatically seeds
the global random number generator
(used by top-level functions like <code>Float64</code> and <code>Int</code>) with a random value,
and the top-level <a href="/pkg/math/rand/#Seed"><code>Seed</code></a> function has been deprecated.
Programs that need a reproducible sequence of random numbers
should prefer to allocate their own random source, using <code>rand.New(rand.NewSource(seed))</code>.
</p>
<p>
Programs that need the earlier consistent global seeding behavior can set
<code>GODEBUG=randautoseed=0</code> in their environment.
</p>
</dd>
</dl><!-- math/rand -->
<dl id="mime"><dt><a href="/pkg/mime/">mime</a></dt>
<dd>
<p><!-- https://go.dev/issue/48866 -->
The <a href="/pkg/mime/#ParseMediaType"><code>ParseMediaType</code></a> function now allows duplicate parameter names,
so long as the values of the names are the same.
</p>
</dd>
</dl><!-- mime -->
<dl id="mime/multipart"><dt><a href="/pkg/mime/multipart/">mime/multipart</a></dt>
<dd>
<p><!-- CL 431675 -->
Methods of the <a href="/pkg/mime/multipart/#Reader"><code>Reader</code></a> type now wrap errors
returned by the underlying <code>io.Reader</code>.
</p>
</dd>
</dl><!-- mime/multipart -->
<dl id="net"><dt><a href="/pkg/net/">net</a></dt>
<dd>
<p><!-- https://go.dev/issue/50101 -->
The <a href="/pkg/net/#LookupCNAME"><code>LookupCNAME</code></a>
function now consistently returns the contents
of a <code>CNAME</code> record when one exists. Previously on Unix systems and
when using the pure Go resolver, <code>LookupCNAME</code> would return an error
if a <code>CNAME</code> record referred to a name that with no <code>A</code>,
</code>AAAA</code>, or <code>CNAME</code> record. This change modifies
<code>LookupCNAME</code> to match the previous behavior on Windows,
allowing allowing <code>LookupCNAME</code> to succeed whenever a
<code>CNAME</code> exists.
</p>
<p><!-- https://go.dev/issue/53482 -->
<a href="/pkg/net/#Interface.Flags"><code>Interface.Flags</code></a> now includes the new flag <code>FlagRunning</code>,
indicating an operationally active interface. An interface which is administratively
configured but not active (for example, because the network cable is not connected)
will have <code>FlagUp</code> set but not <code>FlagRunning</code>.
</p>
<p><!-- https://go.dev/issue/55301 -->
The new <a href="/pkg/net/#Dialer.ControlContext"><code>Dialer.ControlContext</code></a> field contains a callback function
similar to the existing <a href="/pkg/net/#Dialer.Control"><code>Dialer.Control</code></a> hook, that additionally
accepts the dial context as a parameter.
<code>Control</code> is ignored when <code>ControlContext</code> is not nil.
</p>
<p><!-- CL 428955 -->
The Go DNS resolver recognizes the <code>trust-ad</code> resolver option.
When <code>options trust-ad</code> is set in <code>resolv.conf</code>,
the Go resolver will set the AD bit in DNS queries. The resolver does not
make use of the AD bit in responses.
</p>
<p><!-- CL 448075 -->
DNS resolution will detect changes to <code>/etc/nsswitch.conf</code>
and reload the file when it changes. Checks are made at most once every
five seconds, matching the previous handling of <code>/etc/hosts</code>
and <code>/etc/resolv.conf</code>.
</p>
</dd>
</dl><!-- net -->
<dl id="net/http"><dt><a href="/pkg/net/http/">net/http</a></dt>
<dd>
<p><!-- https://go.dev/issue/541360 -->
The new <a href="/pkg/net/http/#ResponseController"><code>ResponseController</code></a> type provides access to extended per-request
functionality not handled by the <a href="/pkg/net/http/#ResponseWriter"><code>ResponseWriter<code></a> interface.
<p>
<p>
The new <a href="/pkg/net/http/#ResponseController.SetReadDeadline"><code>ResponseController.SetReadDeadline</code></a> and
<a href="/pkg/net/http/#ResponseController.SetWriteDeadline"><code>ResponseController.SetWriteDeadline</code></a> methods permit setting
per-request read and write deadlines.
</p>
<p><!-- https://go.dev/issue/51914 -->
The <a href="/pkg/net/http/#ResponseWriter.WriteHeader"><code>ResponseWriter.WriteHeader</code></a> function now supports sending
<code>1xx</code> status codes.
</p>
<p><!-- https://go.dev/issue/41773 -->
The new <a href="/pkg/net/http/#Server.DisableGeneralOptionsHandler"><code>Server.DisableGeneralOptionsHandler</code></a> configuration setting
allows disabling the default <code>OPTIONS *</code> handler.
</p>
<p><!-- https://go.dev/issue/54299 -->
The new <a href="/pkg/net/http/#Transport.OnProxyConnectResponse"><code>Transport.OnProxyConnectResponse</code></a> hook is called
when a <code>Transport</code> receives an HTTP response from a proxy
for a <code>CONNECT</code> request.
</p>
<p><!-- https://go.dev/issue/53960 -->
The HTTP server now accepts HEAD requests containing a body,
rather than rejecting them as invalid.
</p>
<p><!-- https://go.dev/issue/53896 -->
HTTP/2 stream errors returned by <code>net/http</code> functions may be converted
to a <a href="/pkg/golang.org/x/net/http2/#StreamError"><code>golang.org/x/net/http2.StreamError</code></a> using
<a href="/pkg/errors/#As"><code>errors.As</code></a>.
</p>
<p><!-- https://go.dev/cl/397734 -->
Leading and trailing spaces are trimmed from cookie names,
rather than being rejected as invalid.
For example, a cookie setting of "name =value"
is now accepted as setting the cookie "name".
</p>
</dd>
</dl><!-- net/http -->
<dl id="net/netip"><dt><a href="/pkg/net/netip/">net/netip</a></dt>
<dd>
<p><!-- https://go.dev/issue/51766 --><!-- https://go.dev/issue/51777 --><!-- CL 412475 -->
The new <a href="/pkg/net/netip/#IPv6LinkLocalAllRouters">IPv6LinkLocalAllRouters</a>
and <a href="/pkg/net/netip/#IPv6Loopback">IPv6Loopback</a> functions
are the <code>net/netip</code> equivalents of
<a href="/pkg/net/#IPv6loopback"><code>net.IPv6loopback</code></a> and
<a href="/pkg/net/#IPv6linklocalallrouters"><code>net.IPv6linklocalallrouters</code></a>.
</p>
</dd>
</dl><!-- net/netip -->
<dl id="os"><dt><a href="/pkg/os/">os</a></dt>
<dd>
<p><!-- CL 448897 -->
TODO: <a href="https://go.dev/cl/448897">https://go.dev/cl/448897</a>: os: remove special casing of NUL in Windows file operations
</p>
<p><!-- https://go.dev/issue/52747, CL 405275 -->
On Windows, <a href="/pkg/os/#File.Stat"><code>File.Stat</code></a>
now uses the file handle to retrieve attributes when the file is a directory.
Previously it would use the path passed to
<a href="/pkg/os/#Open"><code>Open</code></a>, which may no longer be the file
represented by the file handle if the file has been moved or replaced.
This change modifies <code>Open</code> to open directories without the
<code>FILE_SHARE_DELETE</code> access, which match the behavior of regular files.
</p>
<p><!-- https://go.dev/issue/36019, CL 405275 -->
On Windows, <a href="/pkg/os/#File.Seek"><code>File.Seek</code></a> now supports
seeking to the beginning of a directory.
</p>
</dd>
</dl><!-- os -->
<dl id="os/exec"><dt><a href="/pkg/os/exec/">os/exec</a></dt>
<dd>
<p><!-- https://go.dev/issue/50436, CL 401835 -->
The new <a href="/pkg/os/exec/#Cmd"><code>Cmd</code></a> fields
<a href="/pkg/os/exec/#Cmd.Cancel"><code>Cancel</code></a> and
<a href="/pkg/os/exec/#Cmd.WaitDelay"><code>WaitDelay</code></a>
specify the behavior of the <code>Cmd</code> when its associated
<code>Context</code> is canceled or its process exits with I/O pipes still
held open by a child process.
</p>
</dd>
</dl><!-- os/exec -->
<dl id="path/filepath"><dt><a href="/pkg/path/filepath/">path/filepath</a></dt>
<dd>
<p><!-- CL 363814 --><!-- https://go.dev/issue/47209 -->
The new error <a href="/pkg/path/filepath/#SkipAll"><code>SkipAll</code></a>
terminates a <a href="/pkg/path/filepath/#Walk"><code>Walk</code></a>
immediately but successfully.
</p>
<p><!-- https://go.dev/issue/56219 -->
The new <a href="/pkg/path/filepath/#IsLocal"><code>IsLocal</code></a> function reports whether a path is
lexically local to a directory.
For example, if <code>IsLocal(p)</code> is <code>true</code>,
then <code>Open(p)</code> will refer to a file that is lexically
within the subtree rooted at the current directory.
</p>
</dd>
</dl><!-- io -->
<dl id="reflect"><dt><a href="/pkg/reflect/">reflect</a></dt>
<dd>
<p><!-- https://go.dev/issue/46746 --><!-- CL 423794 -->
The new <a href="/pkg/reflect/#Value.Comparable"><code>Value.Comparable</code></a> and
<a href="/pkg/reflect/#Value.Equal"><code>Value.Equal</code></a> methods
can be used to compare two <code>Value</code>s for equality.
<code>Comparable</code> reports whether <code>Equal</code> is a valid operation for a given <code>Value</code> receiver.
</p>
<p><!-- https://go.dev/issue/48000 --><!-- CL 389635 -->
The new <a href="/pkg/reflect/#Value.Grow"><code>Value.Grow</code></a> method
extends a slice to guarantee space for another <code>n</code> elements.
</p>
<p><!-- https://go.dev/issue/52376 --><!-- CL 411476 -->
The new <a href="/pkg/reflect/#Value.SetZero"><code>Value.SetZero</code></a> method
sets a value to be the zero value for its type.
</p>
<p><!-- CL 425184 -->
Go 1.18 introduced <a href="/pkg/reflect/#Value.SetIterKey"><code>Value.SetIterKey</code></a>
and <a href="/pkg/reflect/#Value.SetIterValue"><code>Value.SetIterValue</code></a> methods.
These are optimizations: <code>v.SetIterKey(it)</code> is meant to be equivalent to <code>v.Set(it.Key())</code>.
The implementations incorrectly omitted a check for use of unexported fields that was present in the unoptimized forms.
Go 1.20 corrects these methods to include the unexported field check.
</p>
</dd>
</dl><!-- reflect -->
<dl id="regexp"><dt><a href="/pkg/regexp/">regexp</a></dt>
<dd>
<p><!-- CL 444817 -->
Go 1.19.2 and Go 1.18.7 included a security fix to the regular expression parser,
making it reject very large expressions that would consume too much memory.
Because Go patch releases do not introduce new API,
the parser returned <a href="/pkg/regexp/syntax/#ErrInternalError"><code>syntax.ErrInternalError</code></a> in this case.
Go 1.20 adds a more specific error, <a href="/pkg/regexp/syntax/#ErrLarge"><code>syntax.ErrLarge</code></a>,
which the parser now returns instead.
</p>
</dd>
</dl><!-- regexp -->
<dl id="runtime/metrics"><dt><a href="/pkg/runtime/metrics/">runtime/metrics</a></dt>
<dd>
<p><!-- https://go.dev/issue/47216 -->
TODO: <a href="https://go.dev/issue/47216">https://go.dev/issue/47216</a>: add GOMAXPROCS, NumCgoCall, GC CPU time
</p>
</dd>
</dl><!-- runtime/metrics -->
<dl id="strings"><dt><a href="/pkg/strings/">strings</a></dt>
<dd>
<p><!-- CL 407176 -->
The new
<a href="/pkg/bytes/#CutPrefix"><code>CutPrefix</code></a> and
<a href="/pkg/bytes/#CutSuffix"><code>CutSuffix</code></a> functions
are like <a href="/pkg/bytes/#TrimPrefix"><code>TrimPrefix</code></a>
and <a href="/pkg/bytes/#TrimSuffix"><code>TrimSuffix</code></a>
but also report whether the string was trimmed.
</p>
<p><!-- CL 359675 -->
The new <a href="/pkg/strings/#Clone"><code>Clone</code></a> function
allocates a copy of a string.
</p>
</dd>
</dl><!-- strings -->
<dl id="sync"><dt><a href="/pkg/sync/">sync</a></dt>
<dd>
<p><!-- CL 399094, https://go.dev/issue/51972 -->
The new <a href="/pkg/sync/#Map"><code>Map</code></a> methods <a href="/pkg/sync/#Map.Swap"><code>Swap</code></a>,
<a href="/pkg/sync/#Map.CompareAndSwap"><code>CompareAndSwap</code></a>, and
<a href="/pkg/sync/#Map.CompareAndDelete"><code>CompareAndDelete</code></a>
allow existing map entries to be updated atomically.
</p>
</dd>
</dl><!-- sync -->
<dl id="syscall"><dt><a href="/pkg/syscall/">syscall</a></dt>
<dd>
<p><!-- CL 407574 -->
TODO: <a href="https://go.dev/cl/407574">https://go.dev/cl/407574</a>: syscall: add new CLONE_ flags for Linux
</p>
<p><!-- CL 411596 -->
TODO: <a href="https://go.dev/cl/411596">https://go.dev/cl/411596</a>: syscall: remove FreeBSD 11 and below 64bit inode compatibility shims
</p>
<p><!-- CL 417695 -->
TODO: <a href="https://go.dev/cl/417695">https://go.dev/cl/417695</a>: syscall: add CgroupFD support for ForkExec on Linux
</p>
</dd>
</dl><!-- syscall -->
<dl id="testing"><dt><a href="/pkg/testing/">testing</a></dt>
<dd>
<p><!-- https://go.dev/issue/43620, CL 420254 -->
The new method <a href="/pkg/testing/#B.Elapsed"><code>B.Elapsed</code></a>
reports the current elapsed time of the benchmark, which may be useful for
calculating rates to report with <code>ReportMetric</code>.
</p>
</dd>
</dl><!-- testing -->
<dl id="time"><dt><a href="/pkg/time/">time</a></dt>
<dd>
<p><!-- https://go.dev/issue/52746 --><!-- CL 412495 -->
The new time layout constants <a href="/pkg/time/#DateTime"><code>DateTime</code></a>,
<a href="/pkg/time/#DateOnly"><code>DateOnly</code></a>, and
<a href="/pkg/time/#TimeOnly"><code>TimeOnly</code></a>
provide names for three of the most common layout strings used in a survey of public Go source code.
</p>
<p><!-- CL 382734 --><!-- https://go.dev/issue/50770 -->
The new <a href="/pkg/time/#Time.Compare"><code>Time.Compare</code></a> method
compares two times.
</p>
<p><!-- CL 425037 -->
<a href="/pkg/time/#Parse"><code>Parse</code></a>
now ignores sub-nanosecond precision in its input,
instead of reporting those digits as an error.
</p>
<p><!-- CL 444277 -->
The <a href="/pkg/time/#Time.MarshalJSON"><code>Time.MarshalJSON</code></a> and
<a href="/pkg/time/#Time.UnmarshalJSON"><code>Time.UnmarshalJSON</code></a> methods
are now more strict about adherence to RFC 3339.
</p>
</dd>
</dl><!-- time -->
<dl id="unicode/utf16"><dt><a href="/pkg/unicode/utf16/">unicode/utf16</a></dt>
<dd>
<p><!-- https://go.dev/issue/51896 --><!-- CL 409054 -->
The new <a href="/pkg/unicode/utf16/#AppendRune"><code>AppendRune</code></a>
function appends the UTF-16 encoding of a given rune to a uint16 slice,
analogous to <a href="/pkg/unicode/utf8/#AppendRune"><code>utf8.AppendRune</code></a>.
</p>
</dd>
</dl><!-- unicode/utf16 -->
<!-- Silence false positives from x/build/cmd/relnote: -->
<!-- https://go.dev/issue/45964 was documented in Go 1.18 release notes but closed recently -->
<!-- https://go.dev/issue/52114 is an accepted proposal to add golang.org/x/net/http2.Transport.DialTLSContext; it's not a part of the Go release -->
<!-- CL 431335: cmd/api: make check pickier about api/*.txt; modified api/next/42537.txt, api/next/43620.txt, api/next/45899.txt, api/next/46746.txt, api/next/50429.txt, api/next/51896.txt, api/next/53482.txt -->
<!-- CL 447896 api: add newline to 55301.txt; modified api/next/55301.txt -->
<!-- CL 449215 api/next/54299: add missing newline; modified api/next/54299.txt -->
<!-- CL 433057 cmd: update vendored golang.org/x/tools for multiple error wrapping -->
<!-- CL 423362 crypto/internal/boring: update to newer boringcrypto, add arm64 -->
<!-- https://go.dev/issue/53481 x/cryptobyte ReadUint64, AddUint64 -->
<!-- https://go.dev/issue/51994 x/crypto/ssh -->
<!-- https://go.dev/issue/55358 x/exp/slices -->
<!-- https://go.dev/issue/54714 x/sys/unix -->
<!-- https://go.dev/issue/50035 https://go.dev/issue/54237 x/time/rate -->
<!-- CL 421879: cmd/cgo: add and use runtime/cgo.Incomplete instead of //go:notinheap -->
<!-- https://go.dev/issue/46731: replace `//go:notinheap` with runtime/internal/sys.NotInHeap -->
<!-- CL 345488 strconv optimization -->
<!-- CL 428757 reflect deprecation, rolled back -->