| <!--{ | |
| "Title": "Go 1.18 Release Notes", | |
| "Path": "/doc/go1.18" | |
| }--> | |
| <!-- | |
| 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.18</h2> | |
| <p> | |
| <strong> | |
| Go 1.18 is not yet released. These are work-in-progress | |
| release notes. Go 1.18 is expected to be released in February 2022. | |
| </strong> | |
| </p> | |
| <h2 id="language">Changes to the language</h2> | |
| <h3 id="generics">Generics</h3> | |
| <p><!-- https://golang.org/issue/43651, https://golang.org/issue/45346 --> | |
| Go 1.18 includes an implementation of generic features as described by the | |
| <a href="https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md">Type | |
| Parameters Proposal</a>. | |
| This includes major - but fully backward-compatible - changes to the language. | |
| The following is a list of the most visible changes. For a more comprehensive overview, see the | |
| <a href="https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md">proposal</a>. | |
| For details see the <a href="https://golang.org/ref/spec">language spec</a>. | |
| </p> | |
| <ul> | |
| <li> | |
| The syntax for | |
| <a href="https://golang.org/ref/spec#Function_declarations">Function</a> and | |
| <a href="https://golang.org/ref/spec#Type_declarations">type declarations</a> | |
| now accepts | |
| <a href="https://golang.org/ref/spec#Type_parameters">type parameters</a>. | |
| </li> | |
| <li> | |
| Parameterized functions and types can be instantiated by following them with a list of | |
| type arguments in square brackets. | |
| </li> | |
| <li> | |
| The new token <code>~</code> has been added to the set of | |
| <a href="https://golang.org/ref/spec#Operators_and_punctuation">operators and punctuation</a>. | |
| </li> | |
| <li> | |
| The syntax for | |
| <a href="https://golang.org/ref/spec#Interface_types">Interface types</a> | |
| now permits the embedding of arbitrary types (not just type names of interfaces) | |
| as well as union and <code>~T</code> type elements. Such interfaces may only be used | |
| as type constraints. | |
| An interface now defines a set of types as well as a set of methods. | |
| </li> | |
| <li> | |
| The new | |
| <a href="https://golang.org/ref/spec#Predeclared_identifiers">predeclared identifier</a> | |
| <code>any</code> is an alias for the empty interface. It may be used instead of | |
| <code>interface{}</code>. | |
| </li> | |
| <li> | |
| The new | |
| <a href="https://golang.org/ref/spec#Predeclared_identifiers">predeclared identifier</a> | |
| <code>comparable</code> is an interface the denotes the set of all types which can be | |
| compared using <code>==</code> or <code>!=</code>. It may only be used as (or embedded in) | |
| a type constraint. | |
| </li> | |
| </ul> | |
| <p> | |
| The current generics implementation has the following limitations: | |
| <ul> | |
| <li><!-- https://golang.org/issue/47631 --> | |
| The Go compiler cannot currently handle type declarations inside generic functions | |
| or methods. We hope to provide support for this feature in Go 1.19. | |
| </li> | |
| </ul> | |
| </p> | |
| <h3 id="bug_fixes">Bug fixes</h3> | |
| <p> | |
| The Go 1.18 compiler now correctly reports <code>declared but not used</code> errors | |
| for variables that are set inside a function literal but are never used. Before Go 1.18, | |
| the compiler did not report an error in such cases. This fixes long-outstanding compiler | |
| issue <a href="https://golang.org/issue/8560">#8560</a>. As a result of this change, | |
| (possibly incorrect) programs may not compile anymore. The necessary fix is | |
| straightforward: fix the program if it was in fact incorrect, or use the offending | |
| variable, for instance by assigning it to the blank identifier <code>_</code>. | |
| Since <code>go vet</code> always pointed out this error, the number of affected | |
| programs is likely very small. | |
| </p> | |
| <p> | |
| The Go 1.18 compiler now reports an overflow when passing a rune constant expression | |
| such as <code>'1' << 32</code> as an argument to the predeclared functions | |
| <code>print</code> and <code>println</code>, consistent with the behavior of | |
| user-defined functions. Before Go 1.18, the compiler did not report an error | |
| in such cases but silently accepted such constant arguments if they fit into an | |
| <code>int64</code>. As a result of this change, (possibly incorrect) programs | |
| may not compile anymore. The necessary fix is straightforward: fix the program if it | |
| was in fact incorrect, or explicitly convert the offending argument to the correct type. | |
| Since <code>go vet</code> always pointed out this error, the number of affected | |
| programs is likely very small. | |
| </p> | |
| <h2 id="ports">Ports</h2> | |
| <h3 id="amd64">AMD64</h3> | |
| <p><!-- CL 349595 --> | |
| Go 1.18 introduces the new <code>GOAMD64</code> environment variable which selects | |
| a version of the AMD64 architecture. Allowed values are <code>v1</code>, | |
| <code>v2</code>, <code>v3</code>, or <code>v4</code>. Each higher level requires, | |
| and takes advantage of, additional processor features. A detailed description of the | |
| versions is <a href="https://en.wikipedia.org/wiki/X86-64#Microarchitecture_levels">here</a>. | |
| </p> | |
| <p> | |
| The <code>GOAMD64</code> environment variable defaults to <code>v1</code>. | |
| </p> | |
| <h3 id="riscv">RISC-V</h3> | |
| <p><!-- golang.org/issue/47100, CL 334872 --> | |
| The 64-bit RISC-V architecture on Linux (the <code>linux/riscv64</code> port) | |
| now supports the <code>c-archive</code> and <code>c-shared</code> build modes. | |
| </p> | |
| <h3 id="windows">Windows</h3> | |
| <p><!-- https://golang.org/issue/49759 --> | |
| The <code>windows/arm</code> and <code>windows/arm64</code> ports now support | |
| non-cooperative preemption, bringing that capability to all four Windows | |
| ports, which should hopefully address subtle bugs encountered when calling | |
| into Win32 functions that block for extended periods of time. | |
| </p> | |
| <h3 id="ios">iOS</h3> | |
| <p><!-- golang.org/issue/48076, golang.org/issue/49616 --> | |
| On iOS (the <code>ios/arm64</code> port) | |
| and iOS simulator running on AMD64-based macOS (the <code>ios/amd64</code> port), | |
| Go 1.18 now requires iOS 12 or later; support for previous versions has been discontinued. | |
| </p> | |
| <h3 id="freebsd">FreeBSD</h3> | |
| <p> | |
| Go 1.18 is the last release that is supported on FreeBSD 11.x, which has | |
| already reached end-of-life. Go 1.19 will require FreeBSD 12.2+ or FreeBSD | |
| 13.0+. | |
| FreeBSD 13.0+ will require a kernel with the COMPAT_FREEBSD12 option set (this is the default). | |
| </p> | |
| <h2 id="tools">Tools</h2> | |
| <h3 id="fuzzing">Fuzzing</h3> | |
| <p> | |
| Go 1.18 includes an implementation of fuzzing as described by | |
| <a href="https://golang.org/issue/44551">the fuzzing proposal</a>. | |
| </p> | |
| <p> | |
| See the <a href="https://go.dev/doc/fuzz">fuzzing landing page</a> to get | |
| started. | |
| </p> | |
| <p> | |
| Please be aware that fuzzing can consume a lot of memory and may impact your | |
| machine’s performance while it runs. Also be aware that the fuzzing engine | |
| writes values that expand test coverage to a fuzz cache directory within | |
| <code>$GOCACHE/fuzz</code> while it runs. There is currently no limit to the | |
| number of files or total bytes that may be written to the fuzz cache, so it | |
| may occupy a large amount of storage (possibly several GBs). | |
| </p> | |
| <h3 id="go-command">Go command</h3> | |
| <p><!-- golang.org/issue/43684 --> | |
| <code>go</code> <code>get</code> no longer builds or installs packages in | |
| module-aware mode. <code>go</code> <code>get</code> is now dedicated to | |
| adjusting dependencies in <code>go.mod</code>. Effectively, the | |
| <code>-d</code> flag is always enabled. To install the latest version | |
| of an executable outside the context of the current module, use | |
| <a href="https://golang.org/ref/mod#go-install"><code>go</code> | |
| <code>install</code> <code>example.com/cmd@latest</code></a>. Any | |
| <a href="https://golang.org/ref/mod#version-queries">version query</a> | |
| may be used instead of <code>latest</code>. This form of <code>go</code> | |
| <code>install</code> was added in Go 1.16, so projects supporting older | |
| versions may need to provide install instructions for both <code>go</code> | |
| <code>install</code> and <code>go</code> <code>get</code>. <code>go</code> | |
| <code>get</code> now reports an error when used outside a module, since there | |
| is no <code>go.mod</code> file to update. In GOPATH mode (with | |
| <code>GO111MODULE=off</code>), <code>go</code> <code>get</code> still builds | |
| and installs packages, as before. | |
| </p> | |
| <p><!-- golang.org/issue/37475 --> | |
| The <code>go</code> command now embeds version control information in | |
| binaries including the currently checked-out revision, commit time, and a | |
| flag indicating whether edited or untracked files are present. Version | |
| control information is embedded if the <code>go</code> command is invoked in | |
| a directory within a Git, Mercurial, Fossil, or Bazaar repository, and the | |
| <code>main</code> package and its containing main module are in the same | |
| repository. This information may be omitted using the flag | |
| <code>-buildvcs=false</code>. | |
| </p> | |
| <p><!-- golang.org/issue/37475 --> | |
| Additionally, the <code>go</code> command embeds information about the build | |
| including build and tool tags (set with <code>-tags</code>), compiler, | |
| assembler, and linker flags (like <code>-gcflags</code>), whether cgo was | |
| enabled, and if it was, the values of the cgo environment variables | |
| (like <code>CGO_CFLAGS</code>). This information may be omitted using the | |
| flag <code>-buildinfo=false</code>. Both VCS and build information may be | |
| read together with module information using <code>go</code> | |
| <code>version</code> <code>-m</code> <code>file</code> or | |
| <code>runtime/debug.ReadBuildInfo</code> (for the currently running binary) | |
| or the new <a href="#debug/buildinfo"><code>debug/buildinfo</code></a> | |
| package. | |
| </p> | |
| <p><!-- https://golang.org/issue/44435 --> | |
| If the main module's <code>go.mod</code> file | |
| specifies <a href="/ref/mod#go-mod-file-go"><code>go</code> <code>1.17</code></a> | |
| or higher, <code>go</code> <code>mod</code> <code>download</code> without | |
| arguments now downloads source code for only the modules | |
| explicitly <a href="/ref/mod#go-mod-file-require">required</a> in the main | |
| module's <code>go.mod</code> file. (In a <code>go</code> <code>1.17</code> or | |
| higher module, that set already includes all dependencies needed to build the | |
| packages and tests in the main module.) | |
| To also download source code for transitive dependencies, use | |
| <code>go</code> <code>mod</code> <code>download</code> <code>all</code>. | |
| </p> | |
| <p><!-- https://golang.org/issue/47327 --> | |
| The <code>go</code> <code>mod</code> <code>vendor</code> subcommand now | |
| supports a <code>-o</code> flag to set the output directory. | |
| (Other <code>go</code> commands still read from the <code>vendor</code> | |
| directory at the module root when loading packages | |
| with <code>-mod=vendor</code>, so the main use for this flag is for | |
| third-party tools that need to collect package source code.) | |
| </p> | |
| <p><!-- CL 298612 --> | |
| The <code>go</code> <code>build</code> command and related commands | |
| now support an <code>-asan</code> flag that enables interoperation | |
| with C (or C++) code compiled with the address sanitizer (C compiler | |
| option <code>-fsanitize=address</code>). | |
| </p> | |
| <h3 id="gofmt"><code>gofmt</code></h3> | |
| <p><!-- https://golang.org/issue/43566 --> | |
| <code>gofmt</code> now reads and formats input files concurrently, with a | |
| memory limit proportional to <code>GOMAXPROCS</code>. On a machine with | |
| multiple CPUs, <code>gofmt</code> should now be significantly faster. | |
| </p> | |
| <h3 id="vet"><code>vet</code></h3> | |
| <h4 id="vet-generics">Updates for Generics</h4> | |
| <p><!-- https://golang.org/issue/48704 --> | |
| The <code>vet</code> tool is updated to support generic code. In most cases, | |
| it reports an error in generic code whenever it would report an error in the | |
| equivalent non-generic code after substituting for type parameters with a | |
| type from their | |
| <a href="https://golang.org/ref/spec#Interface_types">type set</a>. | |
| For example, <code>vet</code> reports a format error in | |
| <pre>func Print[T ~int|~string](t T) { | |
| fmt.Printf("%d", t) | |
| }</pre> | |
| because it would report a format error in the non-generic equivalent of | |
| <code>Print[string]</code>: | |
| <pre>func PrintString(x string) { | |
| fmt.Printf("%d", x) | |
| }</pre> | |
| </p> | |
| <h2 id="runtime">Runtime</h2> | |
| <p><!-- https://golang.org/issue/44167 --> | |
| The garbage collector now includes non-heap sources of garbage collector work | |
| (e.g., stack scanning) when determining how frequently to run. As a result, | |
| garbage collector overhead is more predictable when these sources are | |
| significant. For most applications these changes will be negligible; however, | |
| some Go applications may now use less memory and spend more time on garbage | |
| collection, or vice versa, than before. The intended workaround is to tweak | |
| <code>GOGC</code> where necessary. | |
| </p> | |
| <p><!-- CL 358675, CL 353975, CL 353974 --> | |
| The runtime now returns memory to the operating system more efficiently and has | |
| been tuned to work more aggressively as a result. | |
| </p> | |
| <p><!-- CL 352057, https://golang.org/issue/45728 --> | |
| Go 1.17 generally improved the formatting of arguments in stack traces, | |
| but could print inaccurate values for arguments passed in registers. | |
| This is improved in Go 1.18 by printing a question mark (<code>?</code>) | |
| after each value that may be inaccurate. | |
| </p> | |
| <h2 id="compiler">Compiler</h2> | |
| <p><!-- https://golang.org/issue/40724 --> | |
| Go 1.17 <a href="go1.17#compiler">implemented</a> a new way of passing | |
| function arguments and results using registers instead of the stack | |
| on 64-bit x86 architecture on selected operating systems. | |
| Go 1.18 expands the supported platforms to include 64-bit ARM (<code>GOARCH=arm64</code>), | |
| big- and little-endian 64-bit PowerPC (<code>GOARCH=ppc64</code>, <code>ppc64le</code>), | |
| as well as 64-bit x86 architecture (<code>GOARCH=amd64</code>) | |
| on all operating systems. | |
| On 64-bit ARM and 64-bit PowerPC systems, benchmarking shows | |
| typical performance improvements of 10% or more. | |
| </p> | |
| <p> | |
| As <a href="go1.17#compiler">mentioned</a> in the Go 1.17 release notes, | |
| this change does not affect the functionality of any safe Go code and | |
| is designed to have no impact on most assembly code. See the | |
| <a href="go1.17#compiler">Go 1.17 release notes</a> for more details. | |
| </p> | |
| <p><!-- CL 355497, CL 356869 --> | |
| The compiler now can inline functions that contain range loops or | |
| labeled for loops. | |
| </p> | |
| <p><!-- CL 298611 --> | |
| The new compiler <code>-asan</code> option supports the | |
| new <code>go</code> command <code>-asan</code> option. | |
| </p> | |
| <p> <!-- https://github.com/golang/go/issues/49569 --> | |
| Because of changes in the compiler related to supporting generics, the | |
| Go 1.18 compile speed can be roughly 15% slower than the Go 1.17 compile speed. | |
| The execution time of the compiled code is not affected. We | |
| intend to improve the speed of the compiler in Go 1.19. | |
| </p> | |
| <h2 id="linker">Linker</h2> | |
| <p><!-- CL 298610 --> | |
| The new linker <code>-asan</code> option supports the | |
| new <code>go</code> command <code>-asan</code> option. | |
| </p> | |
| <h2 id="library">Core library</h2> | |
| <h3 id="constraints">New <code>constraints</code> package</h3> | |
| <p><!-- CL 349709 --> | |
| The new <a href="/pkg/constraints/"><code>constraints</code></a> package | |
| defines a set of useful constraints that can be used with type parameters of | |
| generic functions. | |
| </p> | |
| <h3 id="netip">New <code>net/netip</code> package</h3> | |
| <p> | |
| The new <a href="/pkg/net/netip/"><code>net/netip</code></a> | |
| package defines a new IP address type, <a href="/pkg/net/netip/#Addr"><code>Addr</code></a>. | |
| Compared to the existing | |
| <a href="/pkg/net/#IP"><code>net.IP</code></a> type, the <code>netip.Addr</code> type takes less | |
| memory, is immutable, and is comparable so it supports <code>==</code> | |
| and can be used as a map key. | |
| </p> | |
| <p> | |
| In addition to <code>Addr</code>, the package defines | |
| <a href="/pkg/net/netip/#AddrPort"><code>AddrPort</code></a>, representing | |
| an IP and port, and | |
| <a href="/pkg/net/netip/#Prefix"><code>Prefix</code></a>, representing | |
| a network CIDR prefix. | |
| </p> | |
| <p> | |
| The <a href="/pkg/net/"><code>net</code></a> package includes new | |
| methods that parallel existing methods, but | |
| return <code>netip.AddrPort</code> instead of the | |
| heavier-weight <a href="/pkg/net/#IP"><code>net.IP</code></a> or | |
| <a href="/pkg/net/#UDPAddr"<code>*net.UDPAddr</code></a> types. | |
| The <code>net</code> package also now includes functions and methods | |
| to convert between the existing | |
| <a href="/pkg/net/#TCPAddr"><code>TCPAddr</code>/<a href="/pkg/net/#UDPAddr"><code>UDPAddr</code> | |
| types and <code>netip.AddrPort</code>. | |
| </p> | |
| <h3>TODO</h3> | |
| <p> | |
| TODO: complete this section | |
| </p> | |
| <h3 id="minor_library_changes">Minor changes to the library</h3> | |
| <p> | |
| As always, there are various minor changes and updates to the library, | |
| made with the Go 1 <a href="/doc/go1compat">promise of compatibility</a> | |
| in mind. | |
| </p> | |
| <p> | |
| TODO: complete this section | |
| </p> | |
| <dl id="bufio"><dt><a href="/pkg/bufio/">bufio</a></dt> | |
| <dd> | |
| <p><!-- CL 345569 --> | |
| The new <a href="/pkg/bufio#Writer.AvailableBuffer"><code>Writer.AvailableBuffer</code></a> | |
| method returns an empty buffer with a possibly non-empty capacity for use | |
| with append-like APIs. After appending, the buffer can be provided to a | |
| succeeding <code>Write</code> call and possibly avoid any copying. | |
| </p> | |
| <p><!-- CL 345570 --> | |
| The methods <a href="/pkg/bufio#Reader.Reset"><code>Reader.Reset</code></a> and | |
| <a href="/pkg/bufio#Writer.Reset"><code>Writer.Reset</code></a> | |
| now use the default buffer size when called on objects with a | |
| <code>nil</code> buffer. | |
| </p> | |
| </dd> | |
| </dl><!-- bufio --> | |
| <dl id="bytes"><dt><a href="/pkg/bytes/">bytes</a></dt> | |
| <dd> | |
| <p><!-- CL 351710 --> | |
| The new <a href="/pkg/bytes/#Cut"><code>Cut</code></a> function | |
| slices a <code>[]byte</code> around a separator. It can replace | |
| and simplify many common uses of | |
| <a href="/pkg/bytes/#Index"><code>Index</code></a>, | |
| <a href="/pkg/bytes/#IndexByte"><code>IndexByte</code></a>, | |
| <a href="/pkg/bytes/#IndexRune"><code>IndexRune</code></a>, | |
| and <a href="/pkg/bytes/#SplitN"><code>SplitN</code></a>. | |
| </p> | |
| <p><!-- CL 323318, CL 332771 --> | |
| <a href="/pkg/bytes/#Trim"><code>Trim</code></a>, <a href="/pkg/bytes/#TrimLeft"><code>TrimLeft</code></a>, | |
| and <a href="/pkg/bytes/#TrimRight"><code>TrimRight</code></a> are now allocation free and, especially for | |
| small ASCII cutsets, up to 10 times faster. | |
| </p> | |
| <p><!-- CL 359485 --> | |
| The <a href="/pkg/bytes/#Title"><code>Title</code></a> function is now deprecated. It doesn't | |
| handle Unicode punctuation and language-specific capitalization rules, and is superseded by the | |
| <a href="https://golang.org/x/text/cases">golang.org/x/text/cases</a> package. | |
| </p> | |
| </dd> | |
| </dl><!-- bytes --> | |
| <dl id="crypto/tls"><dt><a href="/pkg/crypto/tls/">crypto/tls</a></dt> | |
| <dd> | |
| <p><!-- CL 325250 --> | |
| The new <a href="/pkg/crypto/tls/#Conn.NetConn"><code>Conn.NetConn</code></a> | |
| method allows access to the underlying | |
| <a href="/pkg/net#Conn"><code>net.Conn</code></a>. | |
| </p> | |
| </dd> | |
| </dl><!-- crypto/tls --> | |
| <dl id="debug/buildinfo"><dt><a href="/pkg/debug/buildinfo">debug/buildinfo</a></dt> | |
| <dd> | |
| <p><!-- golang.org/issue/39301 --> | |
| This new package provides access to module versions, version control | |
| information, and build flags embedded in executable files built by | |
| the <code>go</code> command. The same information is also available via | |
| <a href="/pkg/runtime/debug#ReadBuildInfo"><code>runtime/debug.ReadBuildInfo</code></a> | |
| for the currently running binary and via <code>go</code> | |
| <code>version</code> <code>-m</code> on the command line. | |
| </p> | |
| </dd> | |
| </dl> | |
| <dl id="go/ast"><dt><a href="/pkg/go/ast/">go/ast</a></dt> | |
| <dd> | |
| <p><!-- https://golang.org/issue/47781, CL 325689, CL 327149, CL 348375, CL 348609 --> | |
| Per the proposal | |
| <a href="https://go.googlesource.com/proposal/+/master/design/47781-parameterized-go-ast.md"> | |
| Additions to go/ast and go/token to support parameterized functions and types | |
| </a> | |
| the following additions are made to the <a href="/pkg/go/ast"><code>go/ast</code></a> package: | |
| <ul> | |
| <li> | |
| the <a href="/pkg/go/ast/#FuncType"><code>FuncType</code></a> | |
| and <a href="/pkg/go/ast/#TypeSpec"><code>TypeSpec</code></a> | |
| nodes have a new field <code>TypeParams</code> to hold type parameters, if any. | |
| </li> | |
| <li> | |
| The new expression node <a href="/pkg/go/ast/#IndexListExpr"><code>IndexListExpr</code></a> | |
| represents index expressions with multiple indices, used for function and type instantiations | |
| with more than one explicit type argument. | |
| </li> | |
| </ul> | |
| </p> | |
| </dd> | |
| </dl> | |
| <dl id="go/constant"><dt><a href="/pkg/go/constant/">go/constant</a></dt> | |
| <dd> | |
| <p><!-- https://golang.org/issue/46211, CL 320491 --> | |
| The new <a href="/pkg/go/constant/#Kind.String"><code>Kind.String</code></a> | |
| method returns a human-readable name for the receiver kind. | |
| </p> | |
| </dd> | |
| </dl> | |
| <dl id="go/token"><dt><a href="/pkg/go/token/">go/token</a></dt> | |
| <dd> | |
| <p><!-- https://golang.org/issue/47781, CL 324992 --> | |
| The new constant <a href="/pkg/go/token/#TILDE"><code>TILDE</code></a> | |
| represents the <code>~</code> token per the proposal | |
| <a href="https://go.googlesource.com/proposal/+/master/design/47781-parameterized-go-ast.md"> | |
| Additions to go/ast and go/token to support parameterized functions and types | |
| </a>. | |
| </p> | |
| </dd> | |
| </dl> | |
| <dl id="go/types"><dt><a href="/pkg/go/types/">go/types</a></dt> | |
| <dd> | |
| <p><!-- https://golang.org/issue/46648 --> | |
| The new <a href="/pkg/go/types/#Config.GoVersion"><code>Config.GoVersion</code></a> | |
| field sets the accepted Go language version. | |
| </p> | |
| <p><!-- https://golang.org/issue/47916 --> | |
| Per the proposal | |
| <a href="https://go.googlesource.com/proposal/+/master/design/47916-parameterized-go-types.md"> | |
| Additions to go/types to support type parameters | |
| </a> | |
| the following additions are made to the <a href="/pkg/go/types"><code>go/types</code></a> package: | |
| </p> | |
| <ul> | |
| <li> | |
| The new type | |
| <a href="/pkg/go/types/#TypeParam"><code>TypeParam</code></a>, factory function | |
| <a href="/pkg/go/types/#NewTypeParam"><code>NewTypeParam</code></a>, | |
| and associated methods are added to represent a type parameter. | |
| </li> | |
| <li> | |
| The new type | |
| <a href="/pkg/go/types/#TypeParamList"><code>TypeParamList</code></a> holds a list of | |
| type parameters. | |
| </li> | |
| <li> | |
| The new type | |
| <a href="/pkg/go/types/#TypeList"><code>TypeList</code></a> holds a list of types. | |
| </li> | |
| <li> | |
| The new factory function | |
| <a href="/pkg/go/types/#NewSignatureType"><code>NewSignatureType</code></a> allocates a | |
| <a href="/pkg/go/types/#Signature"><code>Signature</code></a> with | |
| (receiver or function) type parameters. | |
| To access those type parameters, the <code>Signature</code> type has two new methods | |
| <a href="/pkg/go/types/#Signature.RecvTypeParams"><code>Signature.RecvTypeParams</code></a> and | |
| <a href="/pkg/go/types/#Signature.TypeParams"><code>Signature.TypeParams</code></a>. | |
| </li> | |
| <li> | |
| <a href="/pkg/go/types/#Named"><code>Named</code></a> types have four new methods: | |
| <a href="/pkg/go/types/#Named.Origin"><code>Named.Origin</code></a> to get the original | |
| parameterized types of instantiated types, | |
| <a href="/pkg/go/types/#Named.TypeArgs"><code>Named.TypeArgs</code></a> and | |
| <a href="/pkg/go/types/#Named.TypeParams"><code>Named.TypeParams</code></a> to get the | |
| type arguments or type parameters of an instantiated or parameterized type, and | |
| <a href="/pkg/go/types/#Named.TypeParams"><code>Named.SetTypeParams</code></a> to set the | |
| type parameters (for instance, when importing a named type where allocation of the named | |
| type and setting of type parameters cannot be done simultaneously due to possible cycles). | |
| </li> | |
| <li> | |
| The <a href="/pkg/go/types/#Interface"><code>Interface</code></a> type has four new methods: | |
| <a href="/pkg/go/types/#Interface.IsComparable"><code>Interface.IsComparable</code></a> and | |
| <a href="/pkg/go/types/#Interface.IsMethodSet"><code>Interface.IsMethodSet</code></a> to | |
| query properties of the type set defined by the interface, and | |
| <a href="/pkg/go/types/#Interface.MarkImplicit"><code>Interface.MarkImplicit</code></a> and | |
| <a href="/pkg/go/types/#Interface.IsImplicit"><code>Interface.IsImplicit</code></a> to set | |
| and test whether the interface is an implicit interface around a type constraint literal. | |
| </li> | |
| <li> | |
| The new types | |
| <a href="/pkg/go/types/#Union"><code>Union</code></a> and | |
| <a href="/pkg/go/types/#Term"><code>Term</code></a>, factory functions | |
| <a href="/pkg/go/types/#NewUnion"><code>NewUnion</code></a> and | |
| <a href="/pkg/go/types/#NewTerm"><code>NewTerm</code></a>, and associated | |
| methods are added to represent type sets in interfaces. | |
| </li> | |
| <li> | |
| The new function | |
| <a href="/pkg/go/types/#Instantiate"><code>Instantiate</code></a> | |
| instantiates a parameterized type. | |
| </li> | |
| <li> | |
| The new <a href="/pkg/go/types/#Info.Instances"><code>Info.Instances</code></a> | |
| map records function and type instantiations through the new | |
| <a href="/pkg/go/types/#Instance"><code>Instance</code></a> type. | |
| </li> | |
| <li><!-- CL 342671 --> | |
| The new type <a href="/pkg/go/types/#ArgumentError"><code>ArgumentError</code></a> | |
| and associated methods are added to represent an error related to a type argument. | |
| </li> | |
| <li><!-- CL 353089 --> | |
| The new type <a href="/pkg/go/types/#Context"><code>Context</code></a> and factory function | |
| <a href="/pkg/go/types/#NewContext"><code>NewContext</code></a> | |
| are added to facilitate sharing of identical type instances across type-checked packages. | |
| </li> | |
| </ul> | |
| </dd> | |
| </dl> | |
| <dl id="image/draw"><dt><a href="/pkg/image/draw/">image/draw</a></dt> | |
| <dd> | |
| <p><!-- CL 340049 --> | |
| The <code>Draw</code> and <code>DrawMask</code> fallback implementations | |
| (used when the arguments are not the most common image types) are now | |
| faster when those arguments implement the optional | |
| <a href="/pkg/image/draw/#RGBA64Image"><code>draw.RGBA64Image</code></a> | |
| and <a href="/pkg/image/#RGBA64Image"><code>image.RGBA64Image</code></a> | |
| interfaces that were added in Go 1.17. | |
| </p> | |
| </dd> | |
| </dl><!-- image/draw --> | |
| <dl id="net"><dt><a href="/pkg/net/">net</a></dt> | |
| <dd> | |
| <p><!-- CL 340261 --> | |
| <a href="/pkg/net#Error"><code>net.Error.Temporary</code></a> has been deprecated. | |
| </p> | |
| </dd> | |
| </dl><!-- net --> | |
| <dl id="net/http"><dt><a href="/pkg/net/http/">net/http</a></dt> | |
| <dd> | |
| <p><!-- CL 330852 --> | |
| On WebAssembly targets, the <code>Dial</code>, <code>DialContext</code>, | |
| <code>DialTLS</code> and <code>DialTLSContext</code> method fields in | |
| <a href="/pkg/net/http/#Transport"><code>Transport</code></a> | |
| will now be correctly used, if specified, for making HTTP requests. | |
| </p> | |
| <p><!-- CL 338590 --> | |
| The new | |
| <a href="/pkg/net/http#Cookie.Valid"><code>Cookie.Valid</code></a> | |
| method reports whether the cookie is valid. | |
| </p> | |
| </dd> | |
| </dl><!-- net/http --> | |
| <dl id="os/user"><dt><a href="/pkg/os/user/">os/user</a></dt> | |
| <dd> | |
| <p><!-- CL 330753 --> | |
| <a href="/pkg/os/user#User.GroupIds"><code>User.GroupIds</code></a>. | |
| now uses a Go native implementation when cgo is not available. | |
| </p> | |
| </dd> | |
| </dl><!-- os/user --> | |
| <dl id="reflect"><dt><a href="/pkg/reflect/">reflect</a></dt> | |
| <dd> | |
| <p><!-- CL 356049, CL 320929 --> | |
| The new | |
| <a href="/pkg/reflect/#Value.SetIterKey"><code>Value.SetIterKey</code></a> | |
| and <a href="/pkg/reflect/#Value.SetIterValue"><code>Value.SetIterValue</code></a> | |
| methods set a Value using a map iterator as the source. They are equivalent to | |
| <code>Value.Set(iter.Key())</code> and <code>Value.Set(iter.Value())</code> but | |
| do fewer allocations. | |
| </p> | |
| <p><!-- CL 350691 --> | |
| The new | |
| <a href="/pkg/reflect/#Value.UnsafePointer"><code>Value.UnsafePointer</code></a> | |
| method returns the Value's value as an <a href="/pkg/unsafe/#Pointer"><code>unsafe.Pointer</code></a>. | |
| This allows callers to migrate from <a href="/pkg/reflect/#Value.UnsafeAddr"><code>Value.UnsafeAddr</code></a> | |
| and <a href="/pkg/reflect/#Value.Pointer"><code>Value.Pointer</code></a> | |
| to eliminate the need to perform uintptr to unsafe.Pointer conversions at the callsite (as unsafe.Pointer rules require). | |
| </p> | |
| <p><!-- CL 321891 --> | |
| The new | |
| <a href="/pkg/reflect/#MapIter.Reset"><code>MapIter.Reset</code></a> | |
| method changes its receiver to iterate over a | |
| different map. The use of | |
| <a href="/pkg/reflect/#MapIter.Reset"><code>MapIter.Reset</code></a> | |
| allows allocation-free iteration | |
| over many maps. | |
| </p> | |
| <p><!-- CL 352131 --> | |
| A number of methods ( | |
| <a href="/pkg/reflect#Value.CanInt"><code>Value.CanInt</code></a>, | |
| <a href="/pkg/reflect#Value.CanUint"><code>Value.CanUint</code></a>, | |
| <a href="/pkg/reflect#Value.CanFloat"><code>Value.CanFloat</code></a>, | |
| <a href="/pkg/reflect#Value.CanComplex"><code>Value.CanComplex</code></a> | |
| ) | |
| have been added to | |
| <a href="/pkg/reflect#Value"><code>Value</code></a> | |
| to test if a conversion is safe. | |
| </p> | |
| <p><!-- CL 357962 --> | |
| <a href="/pkg/reflect#Value.FieldByIndexErr"><code>Value.FieldByIndexErr</code></a> | |
| has been added to avoid the panic that occurs in | |
| <a href="/pkg/reflect#Value.FieldByIndex"><code>Value.FieldByIndex</code></a> | |
| when stepping through a nil pointer to an embedded struct. | |
| </p> | |
| <p><!-- CL 341333 --> | |
| <a href="/pkg/reflect#Ptr"><code>reflect.Ptr</code></a> and | |
| <a href="/pkg/reflect#PtrTo"><code>reflect.PtrTo</code></a> | |
| have been renamed to | |
| <a href="/pkg/reflect#Pointer"><code>reflect.Pointer</code></a> and | |
| <a href="/pkg/reflect#PointerTo"><code>reflect.PointerTo</code></a>, | |
| respectively, for consistency with the rest of the reflect package. | |
| The old names will continue to work, but will be deprecated in a | |
| future Go release. | |
| </p> | |
| </dd> | |
| </dl><!-- reflect --> | |
| <dl id="regexp"><dt><a href="/pkg/regexp/">regexp</a></dt> | |
| <dd> | |
| <p><!-- CL 354569 --> | |
| <a href="/pkg/regexp/"><code>regexp</code></a> | |
| now treats each invalid byte of a UTF-8 string as <code>U+FFFD</code>. | |
| </p> | |
| </dd> | |
| </dl><!-- regexp --> | |
| <dl id="strconv"><dt><a href="/pkg/strconv/">strconv</a></dt> | |
| <dd> | |
| <p><!-- CL 343877 --> | |
| <a href="/pkg/strconv/#strconv.Unquote"><code>strconv.Unquote</code></a> | |
| now rejects Unicode surrogate halves. | |
| </p> | |
| </dd> | |
| </dl><!-- strconv --> | |
| <dl id="strings"><dt><a href="/pkg/strings/">strings</a></dt> | |
| <dd> | |
| <p><!-- CL 351710 --> | |
| The new <a href="/pkg/strings/#Cut"><code>Cut</code></a> function | |
| slices a <code>string</code> around a separator. It can replace | |
| and simplify many common uses of | |
| <a href="/pkg/strings/#Index"><code>Index</code></a>, | |
| <a href="/pkg/strings/#IndexByte"><code>IndexByte</code></a>, | |
| <a href="/pkg/strings/#IndexRune"><code>IndexRune</code></a>, | |
| and <a href="/pkg/strings/#SplitN"><code>SplitN</code></a>. | |
| </p> | |
| <p><!-- CL 345849 --> | |
| The new <a href="/pkg/strings/#Clone"><code>Clone</code></a> function copies the input | |
| <code>string</code> without the returned cloned <code>string</code> referencing | |
| the input string's memory. | |
| </p> | |
| <p><!-- CL 323318, CL 332771 --> | |
| <a href="/pkg/strings/#Trim"><code>Trim</code></a>, <a href="/pkg/strings/#TrimLeft"><code>TrimLeft</code></a>, | |
| and <a href="/pkg/strings/#TrimRight"><code>TrimRight</code></a> are now allocation free and, especially for | |
| small ASCII cutsets, up to 10 times faster. | |
| </p> | |
| <p><!-- CL 359485 --> | |
| The <a href="/pkg/strings/#Title"><code>Title</code></a> function is now deprecated. It doesn't | |
| handle Unicode punctuation and language-specific capitalization rules, and is superseded by the | |
| <a href="https://golang.org/x/text/cases">golang.org/x/text/cases</a> package. | |
| </p> | |
| </dd> | |
| </dl><!-- strings --> | |
| <dl id="sync"><dt><a href="/pkg/sync/">sync</a></dt> | |
| <dd> | |
| <p><!-- CL 319769 --> | |
| The new methods | |
| <a href="/pkg/sync#Mutex.TryLock"><code>Mutex.TryLock</code></a>, | |
| <a href="/pkg/sync#RWMutex.TryLock"><code>RWMutex.TryLock</code></a>, and | |
| <a href="/pkg/sync#RWMutex.TryRLock"><code>RWMutex.TryRLock</code></a>, | |
| will acquire the lock if it is not currently held. | |
| </p> | |
| </dd> | |
| </dl><!-- sync --> | |
| <dl id="syscall"><dt><a href="/pkg/syscall/">syscall</a></dt> | |
| <dd> | |
| <p><!-- CL 336550 --> | |
| The new function <a href="/pkg/syscall/?GOOS=windows#SyscallN"><code>SyscallN</code></a> | |
| has been introduced for Windows, allowing for calls with arbitrary number | |
| of arguments. As a result, | |
| <a href="/pkg/syscall/?GOOS=windows#Syscall"><code>Syscall</code></a>, | |
| <a href="/pkg/syscall/?GOOS=windows#Syscall6"><code>Syscall6</code></a>, | |
| <a href="/pkg/syscall/?GOOS=windows#Syscall9"><code>Syscall9</code></a>, | |
| <a href="/pkg/syscall/?GOOS=windows#Syscall12"><code>Syscall12</code></a>, | |
| <a href="/pkg/syscall/?GOOS=windows#Syscall15"><code>Syscall15</code></a>, and | |
| <a href="/pkg/syscall/?GOOS=windows#Syscall18"><code>Syscall18</code></a> are | |
| deprecated in favor of <a href="/pkg/syscall/?GOOS=windows#SyscallN"><code>SyscallN</code></a>. | |
| </p> | |
| <p><!-- CL 355570 --> | |
| <a href="/pkg/syscall/?GOOS=freebsd#SysProcAttr.Pdeathsig"><code>SysProcAttr.Pdeathsig</code></a>. | |
| is now supported in FreeBSD. | |
| </p> | |
| </dd> | |
| </dl><!-- syscall --> | |
| <dl id="syscall/js"><dt><a href="/pkg/syscall/js/">syscall/js</a></dt> | |
| <dd> | |
| <p><!-- CL 356430 --> | |
| <code>Wrapper</code> interface has been removed. | |
| </p> | |
| </dd> | |
| </dl><!-- syscall/js --> | |
| <dl id="testing"><dt><a href="/pkg/testing/">testing</a></dt> | |
| <dd> | |
| <p><!-- CL 343883 --> | |
| The precedence of <code>/</code> in the argument for <code>-run</code> and | |
| <code>-bench</code> has been increased. <code>A/B|C/D</code> used to be | |
| treated as <code>A/(B|C)/D</code> and is now treated as | |
| <code>(A/B)/(C/D)</code>. | |
| </p> | |
| <p><!-- CL 356669 --> | |
| If the <code>-run</code> option does not select any tests, the | |
| <code>-count</code> option is ignored. This could change the behavior of | |
| existing tests in the unlikely case that a test changes the set of subtests | |
| that are run each time the test function itself is run. | |
| </p> | |
| </dd> | |
| </dl><!-- testing --> | |
| <dl id="text/template"><dt><a href="/pkg/text/template/">text/template</a></dt> | |
| <dd> | |
| <p><!-- CL 321490 --> | |
| The <code>and</code> function no longer always evaluates all arguments; it | |
| stops evaluating arguments after the first argument that evaluates to | |
| false. Similarly, the <code>or</code> function now stops evaluating | |
| arguments after the first argument that evaluates to true. This makes a | |
| difference if any of the arguments is a function call. | |
| </p> | |
| </dd> | |
| </dl><!-- text/template --> | |
| <dl id="unicode/utf8"><dt><a href="/pkg/unicode/utf8/">unicode/utf8</a></dt> | |
| <dd> | |
| <p><!-- CL 345571 --> | |
| The <a href="/pkg/unicode/utf8/#AppendRune"><code>AppendRune</code></a> function appends the UTF-8 new | |
| encoding of a <code>rune</code> to a <code>[]byte</code>. | |
| </p> | |
| </dd> | |
| </dl><!-- unicode/utf8 --> |