| <!--{ |
| "Title": "Go 1.21 Release Notes", |
| "Path": "/doc/go1.21" |
| }--> |
| |
| <!-- |
| 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">Introduction to Go 1.21</h2> |
| |
| <p> |
| The latest Go release, version 1.21, arrives six months after <a href="/doc/go1.20">Go 1.20</a>. |
| Most of its changes are in the implementation of the toolchain, runtime, and libraries. |
| As always, the release maintains the Go 1 <a href="/doc/go1compat">promise of compatibility</a>; |
| in fact, Go 1.21 <a href="#tools">improves upon that promise</a>. |
| We expect almost all Go programs to continue to compile and run as before. |
| </p> |
| |
| <p><!-- https://go.dev/issue/57631 --> |
| Go 1.21 introduces a small change to the numbering of releases. |
| In the past, we used Go 1.<i>N</i> to refer to both the overall Go language version and release family |
| as well as the first release in that family. |
| Starting in Go 1.21, the first release is now Go 1.<i>N</i>.0. |
| Today we are releasing both the Go 1.21 language and its initial implementation, the Go 1.21.0 release. |
| These notes refer to “Go 1.21”; tools like <code>go</code> <code>version</code> will report “<code>go1.21.0</code>” |
| (until you upgrade to Go 1.21.1). |
| See “<a href="/doc/toolchain#version">Go versions</a>” in the “Go Toolchains” documentation for details |
| about the new version numbering. |
| </p> |
| |
| <h2 id="language">Changes to the language</h2> |
| |
| <p> |
| Go 1.21 adds three new built-ins to the language. |
| |
| <ul> |
| <li><!-- https://go.dev/issue/59488 --> |
| The new functions <code>min</code> and <code>max</code> compute the |
| smallest (or largest, for <code>max</code>) value of a fixed number |
| of given arguments. |
| See the language spec for |
| <a href="/ref/spec#Min_and_max">details</a>. |
| </li> |
| <li><!-- https://go.dev/issue/56351 --> |
| The new function <code>clear</code> deletes all elements from a |
| map or zeroes all elements of a slice. |
| See the language spec for |
| <a href="/ref/spec#Clear">details</a>. |
| </li> |
| </ul> |
| </p> |
| |
| <p><!-- https://go.dev/issue/57411 --> |
| Package initialization order is now specified more precisely. The |
| new algorithm is: |
| <ul> |
| <li> |
| Sort all packages by import path. |
| </li> |
| <li>Repeat until the list of packages is empty: |
| <ul> |
| <li> |
| Find the first package in the list for which all imports are |
| already initialized. |
| </li> |
| <li> |
| Initialize that package and remove it from the list. |
| </li> |
| </ul> |
| </li> |
| </ul> |
| This may change the behavior of some programs that rely on a |
| specific initialization ordering that was not expressed by explicit |
| imports. The behavior of such programs was not well defined by the |
| spec in past releases. The new rule provides an unambiguous definition. |
| </p> |
| |
| <p> |
| Multiple improvements that increase the power and precision of type inference have been made. |
| </p> |
| <ul> |
| <li><!-- https://go.dev/issue/59338 --> |
| A (possibly partially instantiated generic) function may now be called with arguments that are |
| themselves (possibly partially instantiated) generic functions. |
| The compiler will attempt to infer the missing type arguments of the callee (as before) and, |
| for each argument that is a generic function that is not fully instantiated, |
| its missing type arguments (new). |
| Typical use cases are calls to generic functions operating on containers |
| (such as <a href="/pkg/slices#IndexFunc">slices.IndexFunc</a>) where a function argument |
| may also be generic, and where the type argument of the called function and its arguments |
| are inferred from the container type. |
| More generally, a generic function may now be used without explicit instantiation when |
| it is assigned to a variable or returned as a result value if the type arguments can |
| be inferred from the assignment. |
| </li> |
| <li><!-- https://go.dev/issue/60353, https://go.dev/issue/57192, https://go.dev/issue/52397, https://go.dev/issue/41176 --> |
| Type inference now also considers methods when a value is assigned to an interface: |
| type arguments for type parameters used in method signatures may be inferred from |
| the corresponding parameter types of matching methods. |
| </li> |
| <li><!-- https://go.dev/issue/51593 https://go.dev/issue/39661 --> |
| Similarly, since a type argument must implement all the methods of its corresponding constraint, |
| the methods of the type argument and constraint are matched which may lead to the inference of |
| additional type arguments. |
| </li> |
| <li><!-- https://go.dev/issue/58671 --> |
| If multiple untyped constant arguments of different kinds (such as an untyped int and |
| an untyped floating-point constant) are passed to parameters with the same (not otherwise |
| specified) type parameter type, instead of an error, now type inference determines the |
| type using the same approach as an operator with untyped constant operands. |
| This change brings the types inferred from untyped constant arguments in line with the |
| types of constant expressions. |
| </li> |
| <li><!-- https://go.dev/issue/59750 --> |
| Type inference is now precise when matching corresponding types in assignments: |
| component types (such as the elements of slices, or the parameter types in function signatures) |
| must be identical (given suitable type arguments) to match, otherwise inference fails. |
| This change produces more accurate error messages: |
| where in the past type inference may have succeeded incorrectly and lead to an invalid assignment, |
| the compiler now reports an inference error if two types can't possibly match. |
| </li> |
| </ul> |
| |
| <p><!-- https://go.dev/issue/58650 --> |
| More generally, the description of |
| <a href="/ref/spec#Type_inference">type inference</a> |
| in the language spec has been clarified. |
| Together, all these changes make type inference more powerful and inference failures less surprising. |
| </p> |
| |
| <!-- https://go.dev/issue/57969 --> |
| <p> |
| Go 1.21 includes a preview of a language change we are considering for a future version of Go: |
| making for loop variables per-iteration instead of per-loop, to avoid accidental sharing bugs. |
| For details about how to try that language change, see <a href="https://go.dev/wiki/LoopvarExperiment">the LoopvarExperiment wiki page</a>. |
| </p> |
| |
| <!-- https://go.dev/issue/25448 --> |
| <p> |
| Go 1.21 now defines that if a goroutine is panicking and recover was called directly by a deferred |
| function, the return value of recover is guaranteed not to be nil. To ensure this, calling panic |
| with a nil interface value (or an untyped nil) causes a run-time panic of type |
| <a href="/pkg/runtime/#PanicNilError"><code>*runtime.PanicNilError</code></a>. |
| </p> |
| <p> |
| To support programs written for older versions of Go, nil panics can be re-enabled by setting |
| <code>GODEBUG=panicnil=1</code>. |
| This setting is enabled automatically when compiling a program whose main package |
| is in a module that declares <code>go</code> <code>1.20</code> or earlier. |
| </p> |
| |
| <h2 id="tools">Tools</h2> |
| <p> |
| Go 1.21 adds improved support for backwards compatibility and forwards compatibility |
| in the Go toolchain. |
| </p> |
| |
| <p><!-- https://go.dev/issue/56986 --> |
| To improve backwards compatibility, Go 1.21 formalizes |
| Go's use of the GODEBUG environment variable to control |
| the default behavior for changes that are non-breaking according to the |
| <a href="/doc/go1compat">compatibility policy</a> |
| but nonetheless may cause existing programs to break. |
| (For example, programs that depend on buggy behavior may break |
| when a bug is fixed, but bug fixes are not considered breaking changes.) |
| When Go must make this kind of behavior change, |
| it now chooses between the old and new behavior based on the |
| <code>go</code> line in the workspace's <code>go.work</code> file |
| or else the main module's <code>go.mod</code> file. |
| Upgrading to a new Go toolchain but leaving the <code>go</code> line |
| set to its original (older) Go version preserves the behavior of the older |
| toolchain. |
| With this compatibility support, the latest Go toolchain should always |
| be the best, most secure, implementation of an older version of Go. |
| See “<a href="/doc/godebug">Go, Backwards Compatibility, and GODEBUG</a>” for details. |
| </p> |
| |
| <p><!-- https://go.dev/issue/57001 --> |
| To improve forwards compatibility, Go 1.21 now reads the <code>go</code> line |
| in a <code>go.work</code> or <code>go.mod</code> file as a strict |
| minimum requirement: <code>go</code> <code>1.21.0</code> means |
| that the workspace or module cannot be used with Go 1.20 or with Go 1.21rc1. |
| This allows projects that depend on fixes made in later versions of Go |
| to ensure that they are not used with earlier versions. |
| It also gives better error reporting for projects that make use of new Go features: |
| when the problem is that a newer Go version is needed, |
| that problem is reported clearly, instead of attempting to build the code |
| and printing errors about unresolved imports or syntax errors. |
| </p> |
| |
| <p> |
| To make these new stricter version requirements easier to manage, |
| the <code>go</code> command can now invoke not just the toolchain |
| bundled in its own release but also other Go toolchain versions found in the PATH |
| or downloaded on demand. |
| If a <code>go.mod</code> or <code>go.work</code> <code>go</code> line |
| declares a minimum requirement on a newer version of Go, the <code>go</code> |
| command will find and run that version automatically. |
| The new <code>toolchain</code> directive sets a suggested minimum toolchain to use, |
| which may be newer than the strict <code>go</code> minimum. |
| See “<a href="/doc/toolchain">Go Toolchains</a>” for details. |
| </p> |
| |
| <h3 id="go-command">Go command</h3> |
| |
| <p><!-- https://go.dev/issue/58099, CL 474236 --> |
| The <code>-pgo</code> build flag now defaults to <code>-pgo=auto</code>, |
| and the restriction of specifying a single main package on the command |
| line is now removed. If a file named <code>default.pgo</code> is present |
| in the main package's directory, the <code>go</code> command will use |
| it to enable profile-guided optimization for building the corresponding |
| program. |
| </p> |
| |
| <p> |
| The <code>-C</code> <code>dir</code> flag must now be the first |
| flag on the command-line when used. |
| </p> |
| |
| <p><!-- https://go.dev/issue/37708, CL 463837 --> |
| The new <code>go</code> <code>test</code> option |
| <code>-fullpath</code> prints full path names in test log messages, |
| rather than just base names. |
| </p> |
| |
| <p><!-- https://go.dev/issue/15513, CL 466397 --> |
| The <code>go</code> <code>test</code> <code>-c</code> flag now |
| supports writing test binaries for multiple packages, each to |
| <code>pkg.test</code> where <code>pkg</code> is the package name. |
| It is an error if more than one test package being compiled has a given package name. |
| </p> |
| |
| <p><!-- https://go.dev/issue/15513, CL 466397 --> |
| The <code>go</code> <code>test</code> <code>-o</code> flag now |
| accepts a directory argument, in which case test binaries are written to that |
| directory instead of the current directory. |
| </p> |
| |
| <h3 id="cgo">Cgo</h3> |
| |
| <p><!-- CL 490819 --> |
| In files that <code>import "C"</code>, the Go toolchain now |
| correctly reports errors for attempts to declare Go methods on C types. |
| </p> |
| |
| <h2 id="runtime-changes">Runtime</h2> |
| |
| <p><!-- https://go.dev/issue/7181 --> |
| When printing very deep stacks, the runtime now prints the first 50 |
| (innermost) frames followed by the bottom 50 (outermost) frames, |
| rather than just printing the first 100 frames. This makes it easier |
| to see how deeply recursive stacks started, and is especially |
| valuable for debugging stack overflows. |
| </p> |
| |
| <p><!-- https://go.dev/issue/59960 --> |
| On Linux platforms that support transparent huge pages, the Go runtime |
| now manages which parts of the heap may be backed by huge pages more |
| explicitly. This leads to better utilization of memory: small heaps |
| should see less memory used (up to 50% in pathological cases) while |
| large heaps should see fewer broken huge pages for dense parts of the |
| heap, improving CPU usage and latency by up to 1%. |
| </p> |
| |
| <p><!-- https://go.dev/issue/57069, https://go.dev/issue/56966 --> |
| As a result of runtime-internal garbage collection tuning, |
| applications may see up to a 40% reduction in application tail latency |
| and a small decrease in memory use. Some applications may also observe |
| a small loss in throughput. |
| |
| The memory use decrease should be proportional to the loss in |
| throughput, such that the previous release's throughput/memory |
| tradeoff may be recovered (with little change to latency) by |
| increasing <code>GOGC</code> and/or <code>GOMEMLIMIT</code> slightly. |
| </p> |
| |
| <p><!-- https://go.dev/issue/51676 --> |
| Calls from C to Go on threads created in C require some setup to prepare for |
| Go execution. On Unix platforms, this setup is now preserved across multiple |
| calls from the same thread. This significantly reduces the overhead of |
| subsequent C to Go calls from ~1-3 microseconds per call to ~100-200 |
| nanoseconds per call. |
| </p> |
| |
| <h2 id="compiler">Compiler</h2> |
| |
| <p> |
| Profile-guide optimization (PGO), added as a preview in Go 1.20, is now ready |
| for general use. PGO enables additional optimizations on code identified as |
| hot by profiles of production workloads. As mentioned in the |
| <a href="#go-command">Go command section</a>, PGO is enabled by default for |
| binaries that contain a <code>default.pgo</code> profile in the main |
| package directory. Performance improvements vary depending on application |
| behavior, with most programs from a representative set of Go programs seeing |
| between 2 and 7% improvement from enabling PGO. See the |
| <a href="/doc/pgo">PGO user guide</a> for detailed documentation. |
| </p> |
| |
| <!-- https://go.dev/issue/59959 --> |
| <p> |
| PGO builds can now devirtualize some interface method calls, adding a |
| concrete call to the most common callee. This enables further optimization, |
| such as inlining the callee. |
| </p> |
| |
| <!-- CL 497455 --> |
| <p> |
| Go 1.21 improves build speed by up to 6%, largely thanks to building the |
| compiler itself with PGO. |
| </p> |
| |
| <h2 id="assembler">Assembler</h2> |
| |
| <!-- https://go.dev/issue/58378 --> |
| <p> |
| On amd64, frameless nosplit assembly functions are no longer automatically marked as <code>NOFRAME</code>. |
| Instead, the <code>NOFRAME</code> attribute must be explicitly specified if desired, |
| which is already the behavior on other architectures supporting frame pointers. |
| With this, the runtime now maintains the frame pointers for stack transitions. |
| </p> |
| |
| <!-- CL 476295 --> |
| <p> |
| The verifier that checks for incorrect uses of <code>R15</code> when dynamic linking on amd64 has been improved. |
| </p> |
| |
| <h2 id="linker">Linker</h2> |
| |
| <p><!-- https://go.dev/issue/57302, CL 461749, CL 457455 --> |
| On windows/amd64, the linker (with help from the compiler) now emits |
| SEH unwinding data by default, which improves the integration |
| of Go applications with Windows debuggers and other tools. |
| </p> |
| |
| <!-- CL 463395, CL 461315 --> |
| <p> |
| In Go 1.21 the linker (with help from the compiler) is now capable of |
| deleting dead (unreferenced) global map variables, if the number of |
| entries in the variable initializer is sufficiently large, and if the |
| initializer expressions are side-effect free. |
| </p> |
| |
| <h2 id="library">Core library</h2> |
| |
| <h3 id="slog">New log/slog package</h3> |
| |
| <p><!-- https://go.dev/issue/59060, https://go.dev/issue/59141, https://go.dev/issue/59204, https://go.dev/issue/59280, |
| https://go.dev/issue/59282, https://go.dev/issue/59339, https://go.dev/issue/59345, https://go.dev/issue/61200, |
| CL 477295, CL 484096, CL 486376, CL 486415, CL 487855, CL 508195 --> |
| The new <a href="/pkg/log/slog">log/slog</a> package provides structured logging with levels. |
| Structured logging emits key-value pairs |
| to enable fast, accurate processing of large amounts of log data. |
| The package supports integration with popular log analysis tools and services. |
| </p> |
| |
| <h3 id="slogtest">New testing/slogtest package</h3> |
| |
| <p><!-- CL 487895 --> |
| The new <a href="/pkg/testing/slogtest">testing/slogtest</a> package can help |
| to validate <a href="/pkg/log/slog#Handler">slog.Handler</a> implementations. |
| </p> |
| |
| <h3 id="slices">New slices package</h3> |
| |
| <p> |
| <!-- https://go.dev/issue/45955, https://go.dev/issue/54768 --> |
| <!-- https://go.dev/issue/57348, https://go.dev/issue/57433 --> |
| <!-- https://go.dev/issue/58565, https://go.dev/issue/60091 --> |
| <!-- https://go.dev/issue/60546 --> |
| <!-- CL 467417, CL 468855, CL 483175, CL 496078, CL 498175, CL 502955 --> |
| The new <a href="/pkg/slices">slices</a> package provides many common |
| operations on slices, using generic functions that work with slices |
| of any element type. |
| </p> |
| |
| <h3 id="maps">New maps package</h3> |
| |
| <p><!-- https://go.dev/issue/57436, CL 464343 --> |
| The new <a href="/pkg/maps/">maps</a> package provides several |
| common operations on maps, using generic functions that work with |
| maps of any key or element type. |
| </p> |
| |
| <h3 id="cmp">New cmp package</h3> |
| |
| <p><!-- https://go.dev/issue/59488, CL 496356 --> |
| The new <a href="/pkg/cmp/">cmp</a> package defines the type |
| constraint <a href="/pkg/cmp/#Ordered"><code>Ordered</code></a> and |
| two new generic functions |
| <a href="/pkg/cmp/#Less"><code>Less</code></a> |
| and <a href="/pkg/cmp/#Compare"><code>Compare</code></a> that are |
| useful with <a href="/ref/spec/#Comparison_operators">ordered |
| types</a>. |
| </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> |
| |
| <dl id="archive/tar"><dt><a href="/pkg/archive/tar/">archive/tar</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/54451, CL 491175 --> |
| The implementation of the |
| <a href="/pkg/io/fs/#FileInfo"><code>io/fs.FileInfo</code></a> |
| interface returned by |
| <a href="/pkg/archive/tar/#Header.FileInfo"><code>Header.FileInfo</code></a> |
| now implements a <code>String</code> method that calls |
| <a href="/pkg/io/fs/#FormatFileInfo"><code>io/fs.FormatFileInfo</code></a>. |
| </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/54451, CL 491175 --> |
| The implementation of the |
| <a href="/pkg/io/fs/#FileInfo"><code>io/fs.FileInfo</code></a> |
| interface returned by |
| <a href="/pkg/archive/zip/#FileHeader.FileInfo"><code>FileHeader.FileInfo</code></a> |
| now implements a <code>String</code> method that calls |
| <a href="/pkg/io/fs/#FormatFileInfo"><code>io/fs.FormatFileInfo</code></a>. |
| </p> |
| |
| <p><!-- https://go.dev/issue/54451, CL 491175 --> |
| The implementation of the |
| <a href="/pkg/io/fs/#DirEntry"><code>io/fs.DirEntry</code></a> |
| interface returned by the |
| <a href="/pkg/io/fs/#ReadDirFile.ReadDir"><code>io/fs.ReadDirFile.ReadDir</code></a> |
| method of the |
| <a href="/pkg/io/fs/#File"><code>io/fs.File</code></a> |
| returned by |
| <a href="/pkg/archive/zip/#Reader.Open"><code>Reader.Open</code></a> |
| now implements a <code>String</code> method that calls |
| <a href="/pkg/io/fs/#FormatDirEntry"><code>io/fs.FormatDirEntry</code></a>. |
| </p> |
| </dd> |
| </dl><!-- archive/zip --> |
| |
| <dl id="bytes"><dt><a href="/pkg/bytes/">bytes</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/53685, CL 474635 --> |
| The <a href="/pkg/bytes/#Buffer"><code>Buffer</code></a> type |
| has two new methods: |
| <a href="/pkg/bytes/#Buffer.Available"><code>Available</code></a> |
| and <a href="/pkg/bytes/#Buffer.AvailableBuffer"><code>AvailableBuffer</code></a>. |
| These may be used along with the |
| <a href="/pkg/bytes/#Buffer.Write"><code>Write</code></a> |
| method to append directly to the <code>Buffer</code>. |
| </p> |
| </dd> |
| </dl><!-- bytes --> |
| |
| <dl id="context"><dt><a href="/pkg/context/">context</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/40221, CL 479918 --> |
| The new <a href="/pkg/context/#WithoutCancel"><code>WithoutCancel</code></a> |
| function returns a copy of a context that is not canceled when the original |
| context is canceled. |
| </p> |
| <p><!-- https://go.dev/issue/56661, CL 449318 --> |
| The new <a href="/pkg/context/#WithDeadlineCause"><code>WithDeadlineCause</code></a> |
| and <a href="/pkg/context/#WithTimeoutCause"><code>WithTimeoutCause</code></a> |
| functions provide a way to set a context cancellation cause when a deadline or |
| timer expires. The cause may be retrieved with the |
| <a href="/pkg/context/#Cause"><code>Cause</code></a> function. |
| </p> |
| <p><!-- https://go.dev/issue/57928, CL 482695 --> |
| The new <a href="/pkg/context/#AfterFunc"><code>AfterFunc</code></a> |
| function registers a function to run after a context has been cancelled. |
| </p> |
| |
| <p><!-- CL 455455 --> |
| An optimization means that the results of calling |
| <a href="/pkg/context/#Background"><code>Background</code></a> |
| and <a href="/pkg/context/#TODO"><code>TODO</code></a> and |
| converting them to a shared type can be considered equal. |
| In previous releases they were always different. Comparing |
| <a href="/pkg/context/#Context"><code>Context</code></a> values |
| for equality has never been well-defined, so this is not |
| considered to be an incompatible change. |
| </p> |
| </dd> |
| </dl> |
| |
| |
| <dl id="crypto/ecdsa"><dt><a href="/pkg/crypto/ecdsa/">crypto/ecdsa</a></dt> |
| <dd> |
| <p><!-- CL 492955 --> |
| <a href="/pkg/crypto/ecdsa/#PublicKey.Equal"><code>PublicKey.Equal</code></a> and |
| <a href="/pkg/crypto/ecdsa/#PrivateKey.Equal"><code>PrivateKey.Equal</code></a> |
| now execute in constant time. |
| </p> |
| </dd> |
| </dl><!-- crypto/ecdsa --> |
| |
| <dl id="crypto/elliptic"><dt><a href="/pkg/crypto/elliptic/">crypto/elliptic</a></dt> |
| <dd> |
| <p><!-- CL 459977 --> |
| All of the <a href="/pkg/crypto/elliptic/#Curve"><code>Curve</code></a> methods have been deprecated, along with <a href="/pkg/crypto/elliptic/#GenerateKey"><code>GenerateKey</code></a>, <a href="/pkg/crypto/elliptic/#Marshal"><code>Marshal</code></a>, and <a href="/pkg/crypto/elliptic/#Unmarshal"><code>Unmarshal</code></a>. For ECDH operations, the new <a href="/pkg/crypto/ecdh/"><code>crypto/ecdh</code></a> package should be used instead. For lower-level operations, use third-party modules such as <a href="https://pkg.go.dev/filippo.io/nistec">filippo.io/nistec</a>. |
| </p> |
| </dd> |
| </dl><!-- crypto/elliptic --> |
| |
| <dl id="crypto/rand"><dt><a href="/pkg/crypto/rand/">crypto/rand</a></dt> |
| <dd> |
| <p><!-- CL 463123 --> |
| The <a href="/pkg/crypto/rand/"><code>crypto/rand</code></a> package now uses the <code>getrandom</code> system call on NetBSD 10.0 and later. |
| </p> |
| </dd> |
| </dl><!-- crypto/rand --> |
| |
| <dl id="crypto/rsa"><dt><a href="/pkg/crypto/rsa/">crypto/rsa</a></dt> |
| <dd> |
| <p><!-- CL 471259, CL 492935 --> |
| The performance of private RSA operations (decryption and signing) is now better than Go 1.19 for <code>GOARCH=amd64</code> and <code>GOARCH=arm64</code>. It had regressed in Go 1.20. |
| </p> |
| <p> |
| Due to the addition of private fields to <a href="/pkg/crypto/rsa/#PrecomputedValues"><code>PrecomputedValues</code></a>, <a href="/pkg/crypto/rsa/#PrivateKey.Precompute"><code>PrivateKey.Precompute</code></a> must be called for optimal performance even if deserializing (for example from JSON) a previously-precomputed private key. |
| </p> |
| <p><!-- CL 492955 --> |
| <a href="/pkg/crypto/rsa/#PublicKey.Equal"><code>PublicKey.Equal</code></a> and |
| <a href="/pkg/crypto/rsa/#PrivateKey.Equal"><code>PrivateKey.Equal</code></a> |
| now execute in constant time. |
| </p> |
| <p><!-- https://go.dev/issue/56921, CL 459976 --> |
| The <a href="/pkg/crypto/rsa/#GenerateMultiPrimeKey"><code>GenerateMultiPrimeKey</code></a> function and the <a href="/pkg/crypto/rsa/#PrecomputedValues.CRTValues"><code>PrecomputedValues.CRTValues</code></a> field have been deprecated. <a href="/pkg/crypto/rsa/#PrecomputedValues.CRTValues"><code>PrecomputedValues.CRTValues</code></a> will still be populated when <a href="/pkg/crypto/rsa/#PrivateKey.Precompute"><code>PrivateKey.Precompute</code></a> is called, but the values will not be used during decryption operations. |
| </p> |
| </dd> |
| </dl><!-- crypto/rsa --> |
| |
| <!-- CL 483815 reverted --> |
| |
| <dl id="crypto/sha256"><dt><a href="/pkg/crypto/sha256/">crypto/sha256</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/50543, CL 408795 --> |
| SHA-224 and SHA-256 operations now use native instructions when available when <code>GOARCH=amd64</code>, providing a performance improvement on the order of 3-4x. |
| </p> |
| </dd> |
| </dl><!-- crypto/sha256 --> |
| |
| <!-- CL 481478 reverted --> |
| <!-- CL 483816 reverted --> |
| |
| <dl id="crypto/tls"><dt><a href="/pkg/crypto/tls/">crypto/tls</a></dt> |
| <dd> |
| <p><!-- CL 497895 --> |
| Servers now skip verifying client certificates (including not running |
| <a href="/pkg/crypto/tls/#Config.VerifyPeerCertificate"><code>Config.VerifyPeerCertificate</code></a>) |
| for resumed connections, besides checking the expiration time. This makes |
| session tickets larger when client certificates are in use. Clients were |
| already skipping verification on resumption, but now check the expiration |
| time even if <a href="/pkg/crypto/tls/#Config.InsecureSkipVerify"><code>Config.InsecureSkipVerify</code></a> |
| is set. |
| </p> |
| |
| <p><!-- https://go.dev/issue/60105, CL 496818, CL 496820, CL 496822, CL 496821, CL 501675 --> |
| Applications can now control the content of session tickets. |
| <ul> |
| <li> |
| The new <a href="/pkg/crypto/tls/#SessionState"><code>SessionState</code></a> type |
| describes a resumable session. |
| </li> |
| <li> |
| The <a href="/pkg/crypto/tls/#SessionState.Bytes"><code>SessionState.Bytes</code></a> |
| method and <a href="/pkg/crypto/tls/#ParseSessionState"><code>ParseSessionState</code></a> |
| function serialize and deserialize a <code>SessionState</code>. |
| </li> |
| <li> |
| The <a href="/pkg/crypto/tls/#Config.WrapSession"><code>Config.WrapSession</code></a> and |
| <a href="/pkg/crypto/tls/#Config.UnwrapSession"><code>Config.UnwrapSession</code></a> |
| hooks convert a <code>SessionState</code> to and from a ticket on the server side. |
| </li> |
| <li> |
| The <a href="/pkg/crypto/tls/#Config.EncryptTicket"><code>Config.EncryptTicket</code></a> |
| and <a href="/pkg/crypto/tls/#Config.DecryptTicket"><code>Config.DecryptTicket</code></a> |
| methods provide a default implementation of <code>WrapSession</code> and |
| <code>UnwrapSession</code>. |
| </li> |
| <li> |
| The <a href="/pkg/crypto/tls/#ClientSessionState.ResumptionState"><code>ClientSessionState.ResumptionState</code></a> method and |
| <a href="/pkg/crypto/tls/#NewResumptionState"><code>NewResumptionState</code></a> function |
| may be used by a <code>ClientSessionCache</code> implementation to store and |
| resume sessions on the client side. |
| </li> |
| </ul> |
| </p> |
| |
| <p><!-- CL 496817 --> |
| To reduce the potential for session tickets to be used as a tracking |
| mechanism across connections, the server now issues new tickets on every |
| resumption (if they are supported and not disabled) and tickets don't bear |
| an identifier for the key that encrypted them anymore. If passing a large |
| number of keys to <a href="/pkg/crypto/tls/#Conn.SetSessionTicketKeys"><code>Conn.SetSessionTicketKeys</code></a>, |
| this might lead to a noticeable performance cost. |
| </p> |
| |
| <p><!-- CL 497376 --> |
| Both clients and servers now implement the Extended Master Secret extension (RFC 7627). |
| The deprecation of <a href="/pkg/crypto/tls/#ConnectionState.TLSUnique"><code>ConnectionState.TLSUnique</code></a> |
| has been reverted, and is now set for resumed connections that support Extended Master Secret. |
| </p> |
| |
| <p><!-- https://go.dev/issue/44886, https://go.dev/issue/60107, CL 493655, CL 496995, CL 514997 --> |
| The new <a href="/pkg/crypto/tls/#QUICConn"><code>QUICConn</code></a> type |
| provides support for QUIC implementations, including 0-RTT support. Note |
| that this is not itself a QUIC implementation, and 0-RTT is still not |
| supported in TLS. |
| </p> |
| |
| <p><!-- https://go.dev/issue/46308, CL 497377 --> |
| The new <a href="/pkg/crypto/tls/#VersionName"><code>VersionName</code></a> function |
| returns the name for a TLS version number. |
| </p> |
| |
| <p><!-- https://go.dev/issue/52113, CL 410496 --> |
| The TLS alert codes sent from the server for client authentication failures have |
| been improved. Previously, these failures always resulted in a "bad certificate" alert. |
| Now, certain failures will result in more appropriate alert codes, |
| as defined by RFC 5246 and RFC 8446: |
| <ul> |
| <li> |
| For TLS 1.3 connections, if the server is configured to require client authentication using |
| <a href="/pkg/crypto/tls/#RequireAnyClientCert"></code>RequireAnyClientCert</code></a> or |
| <a href="/pkg/crypto/tls/#RequireAndVerifyClientCert"></code>RequireAndVerifyClientCert</code></a>, |
| and the client does not provide any certificate, the server will now return the "certificate required" alert. |
| </li> |
| <li> |
| If the client provides a certificate that is not signed by the set of trusted certificate authorities |
| configured on the server, the server will return the "unknown certificate authority" alert. |
| </li> |
| <li> |
| If the client provides a certificate that is either expired or not yet valid, |
| the server will return the "expired certificate" alert. |
| </li> |
| <li> |
| In all other scenarios related to client authentication failures, the server still returns "bad certificate". |
| </li> |
| </ul> |
| </p> |
| </dd> |
| </dl><!-- crypto/tls --> |
| |
| <dl id="crypto/x509"><dt><a href="/pkg/crypto/x509/">crypto/x509</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/53573, CL 468875 --> |
| <a href="/pkg/crypto/x509/#RevocationList.RevokedCertificates"><code>RevocationList.RevokedCertificates</code></a> has been deprecated and replaced with the new <a href="/pkg/crypto/x509/#RevocationList.RevokedCertificateEntries"><code>RevokedCertificateEntries</code></a> field, which is a slice of <a href="/pkg/crypto/x509/#RevocationListEntry"><code>RevocationListEntry</code></a>. <a href="/pkg/crypto/x509/#RevocationListEntry"><code>RevocationListEntry</code></a> contains all of the fields in <a href="/pkg/crypto/x509/pkix#RevokedCertificate"><code>pkix.RevokedCertificate</code></a>, as well as the revocation reason code. |
| </p> |
| |
| <p><!-- CL 478216 --> |
| Name constraints are now correctly enforced on non-leaf certificates, and |
| not on the certificates where they are expressed. |
| </p> |
| </dd> |
| </dl><!-- crypto/x509 --> |
| |
| <dl id="debug/elf"><dt><a href="/pkg/debug/elf/">debug/elf</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/56892, CL 452617 --> |
| The new |
| <a href="/pkg/debug/elf/#File.DynValue"><code>File.DynValue</code></a> |
| method may be used to retrieve the numeric values listed with a |
| given dynamic tag. |
| </p> |
| |
| <p><!-- https://go.dev/issue/56887, CL 452496 --> |
| The constant flags permitted in a <code>DT_FLAGS_1</code> |
| dynamic tag are now defined with type |
| <a href="/pkg/debug/elf/#DynFlag1"><code>DynFlag1</code></a>. These |
| tags have names starting with <code>DF_1</code>. |
| </p> |
| |
| <p><!-- CL 473256 --> |
| The package now defines the constant |
| <a href="/pkg/debug/elf/#COMPRESS_ZSTD"><code>COMPRESS_ZSTD</code></a>. |
| </p> |
| |
| <p><!-- https://go.dev/issue/60348, CL 496918 --> |
| The package now defines the constant |
| <a href="/pkg/debug/elf/#R_PPC64_REL24_P9NOTOC"><code>R_PPC64_REL24_P9NOTOC</code></a>. |
| </p> |
| </dd> |
| </dl><!-- debug/elf --> |
| |
| <dl id="debug/pe"><dt><a href="/pkg/debug/pe/">debug/pe</a></dt> |
| <dd> |
| <p><!-- CL 488475 --> |
| Attempts to read from a section containing uninitialized data |
| using |
| <a href="/pkg/debug/pe/#Section.Data"><code>Section.Data</code></a> |
| or the reader returned by <a href="/pkg/debug/pe/#Section.Open"><code>Section.Open</code></a> |
| now return an error. |
| </p> |
| </dd> |
| </dl><!-- debug/pe --> |
| |
| <dl id="embed"><dt><a href="/pkg/embed/">embed</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/57803, CL 483235 --> |
| The <a href="/pkg/io/fs/#File"><code>io/fs.File</code></a> |
| returned by |
| <a href="/pkg/embed/#FS.Open"><code>FS.Open</code></a> now |
| has a <code>ReadAt</code> method that |
| implements <a href="/pkg/io/#ReaderAt"><code>io.ReaderAt</code></a>. |
| </p> |
| |
| <p><!-- https://go.dev/issue/54451, CL 491175 --> |
| Calling <code><a href="/pkg/embed/FS.Open">FS.Open</a>.<a href="/pkg/io/fs/#File.Stat">Stat</a></code> |
| will return a type that now implements a <code>String</code> |
| method that calls |
| <a href="/pkg/io/fs/#FormatFileInfo"><code>io/fs.FormatFileInfo</code></a>. |
| </p> |
| </dd> |
| </dl><!-- embed --> |
| |
| <dl id="encoding/binary"><dt><a href="/pkg/encoding/binary/">encoding/binary</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/57237, CL 463218, CL 463985 --> |
| The new |
| <a href="/pkg/encoding/binary/#NativeEndian"><code>NativeEndian</code></a> |
| variable may be used to convert between byte slices and integers |
| using the current machine's native endianness. |
| </p> |
| </dd> |
| </dl><!-- encoding/binary --> |
| |
| <dl id="errors"><dt><a href="/pkg/errors/">errors</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/41198, CL 473935 --> |
| The new |
| <a href="/pkg/errors/#ErrUnsupported"><code>ErrUnsupported</code></a> |
| error provides a standardized way to indicate that a requested |
| operation may not be performed because it is unsupported. |
| For example, a call to |
| <a href="/pkg/os/#Link"><code>os.Link</code></a> when using a |
| file system that does not support hard links. |
| </p> |
| </dd> |
| </dl><!-- errors --> |
| |
| <dl id="flag"><dt><a href="/pkg/flag/">flag</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/53747, CL 476015 --> |
| The new <a href="/pkg/flag/#BoolFunc"><code>BoolFunc</code></a> |
| function and |
| <a href="/pkg/flag/#FlagSet.BoolFunc"><code>FlagSet.BoolFunc</code></a> |
| method define a flag that does not require an argument and calls |
| a function when the flag is used. This is similar to |
| <a href="/pkg/flag/#Func"><code>Func</code></a> but for a |
| boolean flag. |
| </p> |
| |
| <p><!-- CL 480215 --> |
| A flag definition |
| (via <a href="/pkg/flag/#Bool"><code>Bool</code></a>, |
| <a href="/pkg/flag/#BoolVar"><code>BoolVar</code></a>, |
| <a href="/pkg/flag/#Int"><code>Int</code></a>, |
| <a href="/pkg/flag/#IntVar"><code>IntVar</code></a>, etc.) |
| will panic if <a href="/pkg/flag/#Set"><code>Set</code></a> has |
| already been called on a flag with the same name. This change is |
| intended to detect cases where <a href="#language">changes in |
| initialization order</a> cause flag operations to occur in a |
| different order than expected. In many cases the fix to this |
| problem is to introduce a explicit package dependence to |
| correctly order the definition before any |
| <a href="/pkg/flag/#Set"><code>Set</code></a> operations. |
| </p> |
| </dd> |
| </dl><!-- flag --> |
| |
| <dl id="go/ast"><dt><a href="/pkg/go/ast/">go/ast</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/28089, CL 487935 --> |
| The new <a href="/pkg/go/ast/#IsGenerated"><code>IsGenerated</code></a> predicate |
| reports whether a file syntax tree contains the |
| <a href="https://go.dev/s/generatedcode">special comment</a> |
| that conventionally indicates that the file was generated by a tool. |
| </p> |
| </dd> |
| |
| <dd> |
| <p><!-- https://go.dev/issue/59033, CL 476276 --> |
| The new |
| <a href="/pkg/go/ast/#File.GoVersion"><code>File.GoVersion</code></a> |
| field records the minimum Go version required by |
| any <code>//go:build</code> or <code>// +build</code> |
| directives. |
| </p> |
| </dd> |
| </dl><!-- go/ast --> |
| |
| <dl id="go/build"><dt><a href="/pkg/go/build/">go/build</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/56986, CL 453603 --> |
| The package now parses build directives (comments that start |
| with <code>//go:</code>) in file headers (before |
| the <code>package</code> declaration). These directives are |
| available in the new |
| <a href="/pkg/go/build#Package"><code>Package</code></a> fields |
| <a href="/pkg/go/build#Package.Directives"><code>Directives</code></a>, |
| <a href="/pkg/go/build#Package.TestDirectives"><code>TestDirectives</code></a>, |
| and |
| <a href="/pkg/go/build#Package.XTestDirectives"><code>XTestDirectives</code></a>. |
| </p> |
| </dd> |
| </dl><!-- go/build --> |
| |
| <dl id="go/build/constraint"><dt><a href="/pkg/go/build/constraint/">go/build/constraint</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/59033, CL 476275 --> |
| The new |
| <a href="/pkg/go/build/constraint/#GoVersion"><code>GoVersion</code></a> |
| function returns the minimum Go version implied by a build |
| expression. |
| </p> |
| </dd> |
| </dl><!-- go/build/constraint --> |
| |
| <dl id="go/token"><dt><a href="/pkg/go/token/">go/token</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/57708, CL 464515 --> |
| The new <a href="/pkg/go/token/#File.Lines"><code>File.Lines</code></a> method |
| returns the file's line-number table in the same form as accepted by |
| <code>File.SetLines</code>. |
| </p> |
| </dd> |
| </dl><!-- go/token --> |
| |
| <dl id="go/types"><dt><a href="/pkg/go/types/">go/types</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/61175, CL 507975 --> |
| The new <a href="/pkg/go/types/#Package.GoVersion"><code>Package.GoVersion</code></a> |
| method returns the Go language version used to check the package. |
| </p> |
| </dd> |
| </dl><!-- go/types --> |
| |
| <dl id="hash/maphash"><dt><a href="/pkg/hash/maphash/">hash/maphash</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/47342, CL 468795 --> |
| The <code>hash/maphash</code> package now has a pure Go implementation, selectable with the <code>purego</code> build tag. |
| </p> |
| </dd> |
| </dl><!-- hash/maphash --> |
| |
| <dl id="html/template"><dt><a href="/pkg/html/template/">html/template</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/59584, CL 496395 --> |
| The new error |
| <a href="/pkg/html/template/#ErrJSTemplate"><code>ErrJSTemplate</code></a> |
| is returned when an action appears in a JavaScript template |
| literal. Previously an unexported error was returned. |
| </p> |
| </dd> |
| </dl><!-- html/template --> |
| |
| <dl id="io/fs"><dt><a href="/pkg/io/fs/">io/fs</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/54451, CL 489555 --> |
| The new |
| <a href="/pkg/io/fs/#FormatFileInfo"><code>FormatFileInfo</code></a> |
| function returns a formatted version of a |
| <a href="/pkg/io/fs/#FileInfo"><code>FileInfo</code></a>. |
| The new |
| <a href="/pkg/io/fs/#FormatDirEntry"><code>FormatDirEntry</code></a> |
| function returns a formatted version of a |
| <a href="/pkg/io/fs/#FileInfo"><code>DirEntry</code></a>. |
| The implementation of |
| <a href="/pkg/io/fs/#DirEntry"><code>DirEntry</code></a> |
| returned by |
| <a href="/pkg/io/fs/#ReadDir"><code>ReadDir</code></a> now |
| implements a <code>String</code> method that calls |
| <a href="/pkg/io/fs/#FormatDirEntry"><code>FormatDirEntry</code></a>, |
| and the same is true for |
| the <a href="/pkg/io/fs/#DirEntry"><code>DirEntry</code></a> |
| value passed to |
| <a href="/pkg/io/fs/#WalkDirFunc"><code>WalkDirFunc</code></a>. |
| </p> |
| </dd> |
| </dl><!-- io/fs --> |
| |
| <!-- https://go.dev/issue/56491 rolled back by https://go.dev/issue/60519 --> |
| <!-- CL 459435 reverted by CL 467255 --> |
| <!-- CL 467515 reverted by CL 499416 --> |
| |
| <dl id="math/big"><dt><a href="/pkg/math/big/">math/big</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/56984, CL 453115, CL 500116 --> |
| The new <a href="/pkg/math/big/#Int.Float64"><code>Int.Float64</code></a> |
| method returns the nearest floating-point value to a |
| multi-precision integer, along with an indication of any |
| rounding that occurred. |
| </p> |
| </dd> |
| </dl><!-- math/big --> |
| |
| <dl id="net"><dt><a href="/pkg/net/">net</a></dt> |
| <dd> |
| <p> |
| <!-- https://go.dev/issue/59166, https://go.dev/issue/56539 --> |
| <!-- CL 471136, CL 471137, CL 471140 --> |
| On Linux, the <a href="/pkg/net/">net</a> package can now use |
| Multipath TCP when the kernel supports it. It is not used by |
| default. To use Multipath TCP when available on a client, call |
| the |
| <a href="/pkg/net/#Dialer.SetMultipathTCP"><code>Dialer.SetMultipathTCP</code></a> |
| method before calling the |
| <a href="/pkg/net/#Dialer.Dial"><code>Dialer.Dial</code></a> or |
| <a href="/pkg/net/#Dialer.DialContext"><code>Dialer.DialContext</code></a> |
| methods. To use Multipath TCP when available on a server, call |
| the |
| <a href="/pkg/net/#ListenConfig.SetMultipathTCP"><code>ListenConfig.SetMultipathTCP</code></a> |
| method before calling the |
| <a href="/pkg/net/#ListenConfig.Listen"><code>ListenConfig.Listen</code></a> |
| method. Specify the network as <code>"tcp"</code> or |
| <code>"tcp4"</code> or <code>"tcp6"</code> as usual. If |
| Multipath TCP is not supported by the kernel or the remote host, |
| the connection will silently fall back to TCP. To test whether a |
| particular connection is using Multipath TCP, use the |
| <a href="/pkg/net/#TCPConn.MultipathTCP"><code>TCPConn.MultipathTCP</code></a> |
| method. |
| </p> |
| <p> |
| In a future Go release we may enable Multipath TCP by default on |
| systems that support it. |
| </p> |
| </dd> |
| </dl><!-- net --> |
| |
| <dl id="net/http"><dt><a href="/pkg/net/http/">net/http</a></dt> |
| <dd> |
| <p><!-- CL 472636 --> |
| The new <a href="/pkg/net/http#ResponseController.EnableFullDuplex"><code>ResponseController.EnableFullDuplex</code></a> |
| method allows server handlers to concurrently read from an HTTP/1 |
| request body while writing the response. Normally, the HTTP/1 server |
| automatically consumes any remaining request body before starting to |
| write the response, to avoid deadlocking clients which attempt to |
| write a complete request before reading the response. The |
| <code>EnableFullDuplex</code> method disables this behavior. |
| </p> |
| |
| <p><!-- https://go.dev/issue/44855, CL 382117 --> |
| The new <a href="/pkg/net/http/#ErrSchemeMismatch"><code>ErrSchemeMismatch</code></a> error is returned by <a href="/pkg/net/http/#Client"><code>Client</code></a> and <a href="/pkg/net/http/#Transport"><code>Transport</code></a> when the server responds to an HTTPS request with an HTTP response. |
| </p> |
| |
| <p><!-- CL 494122 --> |
| The <a href="/pkg/net/http/">net/http</a> package now supports |
| <a href="/pkg/errors/#ErrUnsupported"><code>errors.ErrUnsupported</code></a>, |
| in that the expression |
| <code>errors.Is(http.ErrNotSupported, errors.ErrUnsupported)</code> |
| will return true. |
| </p> |
| </dd> |
| </dl><!-- net/http --> |
| |
| <dl id="os"><dt><a href="/pkg/os/">os</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/32558, CL 219638 --> |
| Programs may now pass an empty <code>time.Time</code> value to |
| the <a href="/pkg/os/#Chtimes"><code>Chtimes</code></a> function |
| to leave either the access time or the modification time unchanged. |
| </p> |
| |
| <p><!-- CL 480135 --> |
| On Windows the |
| <a href="/pkg/os#File.Chdir"><code>File.Chdir</code></a> method |
| now changes the current directory to the file, rather than |
| always returning an error. |
| </p> |
| |
| <p><!-- CL 495079 --> |
| On Unix systems, if a non-blocking descriptor is passed |
| to <a href="/pkg/os/#NewFile"><code>NewFile</code></a>, calling |
| the <a href="/pkg/os/#File.Fd"><code>File.Fd</code></a> method |
| will now return a non-blocking descriptor. Previously the |
| descriptor was converted to blocking mode. |
| </p> |
| |
| <p><!-- CL 477215 --> |
| On Windows calling |
| <a href="/pkg/os/#Truncate"><code>Truncate</code></a> on a |
| non-existent file used to create an empty file. It now returns |
| an error indicating that the file does not exist. |
| </p> |
| |
| <p><!-- https://go.dev/issue/56899, CL 463219 --> |
| On Windows calling |
| <a href="/pkg/os/#TempDir"><code>TempDir</code></a> now uses |
| GetTempPath2W when available, instead of GetTempPathW. The |
| new behavior is a security hardening measure that prevents |
| temporary files created by processes running as SYSTEM to |
| be accessed by non-SYSTEM processes. |
| </p> |
| |
| <p><!-- CL 493036 --> |
| On Windows the os package now supports working with files whose |
| names, stored as UTF-16, can't be represented as valid UTF-8. |
| </p> |
| |
| <p><!-- CL 463177 --> |
| On Windows <a href="/pkg/os/#Lstat"><code>Lstat</code></a> now resolves |
| symbolic links for paths ending with a path separator, consistent with its |
| behavior on POSIX platforms. |
| </p> |
| |
| <p><!-- https://go.dev/issue/54451, CL 491175 --> |
| The implementation of the |
| <a href="/pkg/io/fs/#DirEntry"><code>io/fs.DirEntry</code></a> |
| interface returned by the |
| <a href="/pkg/os/#ReadDir"><code>ReadDir</code></a> function and |
| the <a href="/pkg/os/#File.ReadDir"><code>File.ReadDir</code></a> |
| method now implements a <code>String</code> method that calls |
| <a href="/pkg/io/fs/#FormatDirEntry"><code>io/fs.FormatDirEntry</code></a>. |
| </p> |
| |
| <p><!-- https://go.dev/issue/53761, CL 416775, CL 498015--> |
| The implementation of the |
| <a href="/pkg/io/fs/#FS"><code>io/fs.FS</code></a> interface returned by |
| the <a href="/pkg/os/#DirFS"><code>DirFS</code></a> function now implements |
| the <a href="/pkg/io/fs/#ReadFileFS"><code>io/fs.ReadFileFS</code></a> and |
| the <a href="/pkg/io/fs/#ReadDirFS"><code>io/fs.ReadDirFS</code></a> |
| interfaces. |
| </p> |
| </dd> |
| </dl><!-- os --> |
| |
| <dl id="path/filepath"><dt><a href="/pkg/path/filepath/">path/filepath</a></dt> |
| <dd> |
| <p> |
| The implementation of the |
| <a href="/pkg/io/fs/#DirEntry"><code>io/fs.DirEntry</code></a> |
| interface passed to the function argument of |
| <a href="/pkg/path/filepath/#WalkDir"><code>WalkDir</code></a> |
| now implements a <code>String</code> method that calls |
| <a href="/pkg/io/fs/#FormatDirEntry"><code>io/fs.FormatDirEntry</code></a>. |
| </p> |
| </dd> |
| </dl><!-- path/filepath --> |
| |
| <!-- CL 459455 reverted --> |
| |
| <dl id="reflect"><dt><a href="/pkg/reflect/">reflect</a></dt> |
| <dd> |
| <p><!-- CL 408826, CL 413474 --> |
| In Go 1.21, <a href="/pkg/reflect/#ValueOf"><code>ValueOf</code></a> |
| no longer forces its argument to be allocated on the heap, allowing |
| a <code>Value</code>'s content to be allocated on the stack. Most |
| operations on a <code>Value</code> also allow the underlying value |
| to be stack allocated. |
| </p> |
| |
| <p><!-- https://go.dev/issue/55002 --> |
| The new <a href="/pkg/reflect/#Value"><code>Value</code></a> |
| method <a href="/pkg/reflect/#Value.Clear"><code>Value.Clear</code></a> |
| clears the contents of a map or zeros the contents of a slice. |
| This corresponds to the new <code>clear</code> built-in |
| <a href="#language">added to the language</a>. |
| </p> |
| |
| <p><!-- https://go.dev/issue/56906, CL 452762 --> |
| The <a href="/pkg/reflect/#SliceHeader"><code>SliceHeader</code></a> |
| and <a href="/pkg/reflect/#StringHeader"><code>StringHeader</code></a> |
| types are now deprecated. In new code |
| prefer <a href="/pkg/unsafe/#Slice"><code>unsafe.Slice</code></a>, |
| <a href="/pkg/unsafe/#SliceData"><code>unsafe.SliceData</code></a>, |
| <a href="/pkg/unsafe/#String"><code>unsafe.String</code></a>, |
| or <a href="/pkg/unsafe/#StringData"><code>unsafe.StringData</code></a>. |
| </p> |
| </dd> |
| </dl><!-- reflect --> |
| |
| <dl id="regexp"><dt><a href="/pkg/regexp/">regexp</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/46159, CL 479401 --> |
| <a href="/pkg/regexp#Regexp"><code>Regexp</code></a> now defines |
| <a href="/pkg/regexp#Regexp.MarshalText"><code>MarshalText</code></a> |
| and <a href="/pkg/regexp#Regexp.UnmarshalText"><code>UnmarshalText</code></a> |
| methods. These implement |
| <a href="/pkg/encoding#TextMarshaler"><code>encoding.TextMarshaler</code></a> |
| and |
| <a href="/pkg/encoding#TextUnmarshaler"><code>encoding.TextUnmarshaler</code></a> |
| and will be used by packages such as |
| <a href="/pkg/encoding/json">encoding/json</a>. |
| </p> |
| </dd> |
| </dl><!-- regexp --> |
| |
| <dl id="runtime"><dt><a href="/pkg/runtime/">runtime</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/38651, CL 435337 --> |
| Textual stack traces produced by Go programs, such as those |
| produced when crashing, calling <code>runtime.Stack</code>, or |
| collecting a goroutine profile with <code>debug=2</code>, now |
| include the IDs of the goroutines that created each goroutine in |
| the stack trace. |
| </p> |
| |
| <p><!-- https://go.dev/issue/57441, CL 474915 --> |
| Crashing Go applications can now opt-in to Windows Error Reporting (WER) by setting the environment variable |
| <code>GOTRACEBACK=wer</code> or calling <a href="/pkg/runtime/debug/#SetTraceback"><code>debug.SetTraceback("wer")</code></a> |
| before the crash. Other than enabling WER, the runtime will behave as with <code>GOTRACEBACK=crash</code>. |
| On non-Windows systems, <code>GOTRACEBACK=wer</code> is ignored. |
| </p> |
| |
| <p><!-- CL 447778 --> |
| <code>GODEBUG=cgocheck=2</code>, a thorough checker of cgo pointer passing rules, |
| is no longer available as a <a href="/pkg/runtime#hdr-Environment_Variables">debug option</a>. |
| Instead, it is available as an experiment using <code>GOEXPERIMENT=cgocheck2</code>. |
| In particular this means that this mode has to be selected at build time instead of startup time. |
| </p> |
| |
| <p> |
| <code>GODEBUG=cgocheck=1</code> is still available (and is still the default). |
| </p> |
| |
| <p><!-- https://go.dev/issue/46787, CL 367296 --> |
| A new type <code>Pinner</code> has been added to the runtime |
| package. <code>Pinner</code>s may be used to "pin" Go memory |
| such that it may be used more freely by non-Go code. For instance, |
| passing Go values that reference pinned Go memory to C code is |
| now allowed. Previously, passing any such nested reference was |
| disallowed by the |
| <a href="https://pkg.go.dev/cmd/cgo#hdr-Passing_pointers">cgo pointer passing rules.</a> |
| |
| See <a href="/pkg/runtime#Pinner">the docs</a> for more details. |
| </p> |
| |
| <!-- CL 472195 no release note needed --> |
| </dd> |
| </dl><!-- runtime --> |
| |
| <dl id="runtime/metrics"><dt><a href="/pkg/runtime/metrics/">runtime/metrics</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/56857, CL 497315 --> |
| A few previously-internal GC metrics, such as live heap size, are |
| now available. |
| |
| <code>GOGC</code> and <code>GOMEMLIMIT</code> are also now |
| available as metrics. |
| </p> |
| </dd> |
| </dl><!-- runtime/metrics --> |
| |
| <dl id="runtime/trace"><dt><a href="/pkg/runtime/trace/">runtime/trace</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/16638 --> |
| Collecting traces on amd64 and arm64 now incurs a substantially |
| smaller CPU cost: up to a 10x improvement over the previous release. |
| </p> |
| |
| <p><!-- CL 494495 --> |
| Traces now contain explicit stop-the-world events for every reason |
| the Go runtime might stop-the-world, not just garbage collection. |
| </p> |
| </dd> |
| </dl><!-- runtime/trace --> |
| |
| <dl id="sync"><dt><a href="/pkg/sync/">sync</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/56102, CL 451356 --> |
| The new <a href="/pkg/sync/#OnceFunc"><code>OnceFunc</code></a>, |
| <a href="/pkg/sync/#OnceValue"><code>OnceValue</code></a>, and |
| <a href="/pkg/sync/#OnceValues"><code>OnceValues</code></a> |
| functions capture a common use of <a href="/pkg/sync/#Once">Once</a> to |
| lazily initialize a value on first use. |
| </p> |
| </dd> |
| </dl> |
| |
| <dl id="syscall"><dt><a href="/pkg/syscall/">syscall</a></dt> |
| <dd> |
| <p><!-- CL 480135 --> |
| On Windows the |
| <a href="/pkg/syscall#Fchdir"><code>Fchdir</code></a> function |
| now changes the current directory to its argument, rather than |
| always returning an error. |
| </p> |
| |
| <p><!-- https://go.dev/issue/46259, CL 458335 --> |
| On FreeBSD |
| <a href="/pkg/syscall#SysProcAttr"><code>SysProcAttr</code></a> |
| has a new field <code>Jail</code> that may be used to put the |
| newly created process in a jailed environment. |
| </p> |
| |
| <p><!-- CL 493036 --> |
| On Windows the syscall package now supports working with files whose |
| names, stored as UTF-16, can't be represented as valid UTF-8. |
| The <a href="/pkg/syscall#UTF16ToString"><code>UTF16ToString</code></a> |
| and <a href="/pkg/syscall#UTF16FromString"><code>UTF16FromString</code></a> |
| functions now convert between UTF-16 data and |
| <a href="https://simonsapin.github.io/wtf-8/">WTF-8</a> strings. |
| This is backward compatible as WTF-8 is a superset of the UTF-8 |
| format that was used in earlier releases. |
| </p> |
| |
| <p><!-- CL 476578, CL 476875, CL 476916 --> |
| Several error values match the new |
| <a href="/pkg/errors/#ErrUnsupported"><code>errors.ErrUnsupported</code></a>, |
| such that <code>errors.Is(err, errors.ErrUnsupported)</code> |
| returns true. |
| <ul> |
| <li><code>ENOSYS</code></li> |
| <li><code>ENOTSUP</code></li> |
| <li><code>EOPNOTSUPP</code></li> |
| <li><code>EPLAN9</code> (Plan 9 only)</li> |
| <li><code>ERROR_CALL_NOT_IMPLEMENTED</code> (Windows only)</li> |
| <li><code>ERROR_NOT_SUPPORTED</code> (Windows only)</li> |
| <li><code>EWINDOWS</code> (Windows only)</li> |
| </ul> |
| </p> |
| </dd> |
| </dl><!-- syscall --> |
| |
| <dl id="testing"><dt><a href="/pkg/testing/">testing</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/37708, CL 463837 --> |
| The new <code>-test.fullpath</code> option will print full path |
| names in test log messages, rather than just base names. |
| </p> |
| |
| <p><!-- https://go.dev/issue/52600, CL 475496 --> |
| The new <a href="/pkg/testing/#Testing"><code>Testing</code></a> function reports whether the program is a test created by <code>go</code> <code>test</code>. |
| </p> |
| </dd> |
| </dl><!-- testing --> |
| |
| <dl id="testing/fstest"><dt><a href="/pkg/testing/fstest/">testing/fstest</a></dt> |
| <dd> |
| <p><!-- https://go.dev/issue/54451, CL 491175 --> |
| Calling <code><a href="/pkg/testing/fstest/MapFS.Open">Open</a>.<a href="/pkg/io/fs/#File.Stat">Stat</a></code> |
| will return a type that now implements a <code>String</code> |
| method that calls |
| <a href="/pkg/io/fs/#FormatFileInfo"><code>io/fs.FormatFileInfo</code></a>. |
| </p> |
| </dd> |
| </dl><!-- testing/fstest --> |
| |
| <dl id="unicode"><dt><a href="/pkg/unicode/">unicode</a></dt> |
| <dd> |
| <p><!-- CL 456837 --> |
| The <a href="/pkg/unicode/"><code>unicode</code></a> package and |
| associated support throughout the system has been upgraded to |
| <a href="https://www.unicode.org/versions/Unicode15.0.0/">Unicode 15.0.0</a>. |
| </p> |
| </dd> |
| </dl><!-- unicode --> |
| |
| <h2 id="ports">Ports</h2> |
| |
| <h3 id="darwin">Darwin</h3> |
| |
| <p><!-- https://go.dev/issue/57125 --> |
| As <a href="go1.20#darwin">announced</a> in the Go 1.20 release notes, |
| Go 1.21 requires macOS 10.15 Catalina or later; |
| support for previous versions has been discontinued. |
| </p> |
| |
| <h3 id="windows">Windows</h3> |
| |
| <p><!-- https://go.dev/issue/57003, https://go.dev/issue/57004 --> |
| As <a href="go1.20#windows">announced</a> in the Go 1.20 release notes, |
| Go 1.21 requires at least Windows 10 or Windows Server 2016; |
| support for previous versions has been discontinued. |
| </p> |
| |
| <!-- CL 470695 --> |
| <p> |
| <!-- cmd/dist: default to GOARM=7 on all non-arm systems --> |
| </p> |
| |
| <h3 id="wasm">WebAssembly</h3> |
| |
| <p><!-- https://go.dev/issue/38248, https://go.dev/issue/59149, CL 489255 --> |
| The new <code>go:wasmimport</code> directive can now be used in Go programs |
| to import functions from the WebAssembly host. |
| </p> |
| |
| <!-- https://go.dev/issue/56100 --> |
| <p> |
| The Go scheduler now interacts much more efficiently with the |
| JavaScript event loop, especially in applications that block |
| frequently on asynchronous events. |
| </p> |
| |
| |
| <h3 id="wasip1">WebAssembly System Interface</h3> |
| |
| <p><!-- https://go.dev/issue/58141 --> |
| Go 1.21 adds an experimental port to the <a href="https://wasi.dev/"> |
| WebAssembly System Interface (WASI)</a>, Preview 1 |
| (<code>GOOS=wasip1</code>, <code>GOARCH=wasm</code>). |
| </p> |
| |
| <p> |
| As a result of the addition of the new <code>GOOS</code> value |
| "<code>wasip1</code>", Go files named <code>*_wasip1.go</code> |
| will now be <a href="/pkg/go/build/#hdr-Build_Constraints">ignored |
| by Go tools</a> except when that <code>GOOS</code> value is being |
| used. |
| If you have existing filenames matching that pattern, you will |
| need to rename them. |
| </p> |
| |
| <h3 id="PPC64">ppc64/ppc64le</h3> |
| |
| <p><!-- go.dev/issue/44549 --> |
| On Linux, <code>GOPPC64=power10</code> now generates PC-relative instructions, prefixed |
| instructions, and other new Power10 instructions. On AIX, <code>GOPPC64=power10</code> |
| generates Power10 instructions, but does not generate PC-relative instructions. |
| </p> |
| |
| <p> |
| When building position-independent binaries for <code>GOPPC64=power10</code> |
| <code>GOOS=linux</code> <code>GOARCH=ppc64le</code>, users can expect reduced binary |
| sizes in most cases, in some cases 3.5%. Position-independent binaries are built for |
| ppc64le with the following <code>-buildmode</code> values: |
| <code>c-archive</code>, <code>c-shared</code>, <code>shared</code>, <code>pie</code>, <code>plugin</code>. |
| </p> |
| |
| <h3 id="loong64">loong64</h3> |
| |
| <p><!-- go.dev/issue/53301, CL 455075, CL 425474, CL 425476, CL 425478, CL 489576 --> |
| The <code>linux/loong64</code> port now supports <code>-buildmode=c-archive</code>, |
| <code>-buildmode=c-shared</code> and <code>-buildmode=pie</code>. |
| </p> |
| |
| <!-- proposals for x repos that don't need to be mentioned here but |
| are picked up by the relnote tool. --> |
| <!-- https://go.dev/issue/54232 --> |
| <!-- https://go.dev/issue/57051 --> |
| <!-- https://go.dev/issue/57792 --> |
| <!-- https://go.dev/issue/57906 --> |
| <!-- https://go.dev/issue/58668 --> |
| <!-- https://go.dev/issue/59016 --> |
| <!-- https://go.dev/issue/59676 --> |
| <!-- https://go.dev/issue/60409 --> |
| <!-- https://go.dev/issue/61176 --> |
| |
| <!-- changes to cmd/api that don't need release notes. --> |
| <!-- CL 469115, CL 469135, CL 499981 --> |
| |
| <!-- proposals that don't need release notes. --> |
| <!-- https://go.dev/issue/10275 --> |
| <!-- https://go.dev/issue/59719 --> |