| <!--{ |
| "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><dir></code> to change directory to <dir> |
| 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><pattern></code> to skip <code>//go:generate</code> directives |
| matching <code><pattern></code>. |
| </p> |
| |
| <p><!-- https://go.dev/issue/41583 --> |
| The <code>go</code> <code>test</code> command now accepts |
| <code>-skip</code> <code><pattern></code> to skip tests, subtests, or examples |
| matching <code><pattern></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><a:b:c></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 --> |