| <!--{ |
| "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> |
| |
| <p> |
| TODO: complete this section |
| </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> |
| |
| <h3 id="generics">Generics</h3> |
| |
| <p> |
| Go 1.18 includes an implementation of generics as described |
| by <a href="https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md">the |
| proposal</a>. |
| </p> |
| |
| <p> |
| The current generics implementation has the following limitations: |
| <ul> |
| <li><!-- 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> |
| |
| <h2 id="ports">Ports</h2> |
| |
| <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> |
| |
| <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="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> |
| |
| <h2 id="tools">Tools</h2> |
| |
| <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> |
| |
| <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> |
| |
| <h2 id="runtime">Runtime</h2> |
| |
| <p> |
| TODO: complete this section, or delete if not needed |
| </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 |
| 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 298611 --> |
| TODO: <a href="https://golang.org/cl/298611">https://golang.org/cl/298611</a>: cmd/compile: add -asan option |
| </p> |
| |
| <p><!-- CL 352057 --> |
| TODO: <a href="https://golang.org/cl/352057">https://golang.org/cl/352057</a>: cmd/compile, runtime: track argument stack slot liveness |
| </p> |
| |
| <h2 id="linker">Linker</h2> |
| |
| <p><!-- CL 298610 --> |
| TODO: <a href="https://golang.org/cl/298610">https://golang.org/cl/298610</a>: cmd/link: add -asan option |
| </p> |
| |
| <h2 id="library">Core library</h2> |
| |
| <h3 id="constraints">New <code>constraints</code> package</h3> |
| |
| <p><!-- CL 349709 --> |
| TODO: <a href="https://golang.org/cl/349709">https://golang.org/cl/349709</a>: constraints: new package |
| </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 <code>net</code> package now has methods to send and receive UDP packets |
| using <code>netip.Addr</code> values instead of the relatively heavy |
| <code>*net.UDPAddr</code> values. |
| </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#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 332771 --> |
| <a href="/pkg/bytes#Trim"><code>bytes.Trim</code></a> and related |
| functions, have had their most common use cases optimized. |
| </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 --> |
| TODO: <a href="https://golang.org/cl/325250">https://golang.org/cl/325250</a>: add Conn.NetConn method |
| </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="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 --> |
| TODO: <a href="https://golang.org/cl/340261">https://golang.org/cl/340261</a>: deprecate (net.Error).Temporary |
| </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 --> |
| TODO: <a href="https://golang.org/cl/338590">https://golang.org/cl/338590</a>: add Cookie.Valid method |
| </p> |
| </dd> |
| </dl><!-- net/http --> |
| |
| <dl id="os/user"><dt><a href="/pkg/os/user/">os/user</a></dt> |
| <dd> |
| <p><!-- CL 330753 --> |
| TODO: <a href="https://golang.org/cl/330753">https://golang.org/cl/330753</a>: implement go native GroupIds |
| </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 321889 --> |
| TODO: <a href="https://golang.org/cl/321889">https://golang.org/cl/321889</a>: allocate hiter as part of MapIter |
| </p> |
| |
| <p><!-- CL 321891 --> |
| TODO: <a href="https://golang.org/cl/321891">https://golang.org/cl/321891</a>: add MapIter.Reset |
| </p> |
| |
| <p><!-- CL 345486 --> |
| TODO: <a href="https://golang.org/cl/345486">https://golang.org/cl/345486</a>: optimize for maps with string keys |
| </p> |
| |
| <p><!-- CL 352131 --> |
| TODO: <a href="https://golang.org/cl/352131">https://golang.org/cl/352131</a>: add Value.{CanInt, CanUint, CanFloat, CanComplex} |
| </p> |
| |
| <p><!-- CL 357962 --> |
| TODO: <a href="https://golang.org/cl/357962">https://golang.org/cl/357962</a>: add FieldByIndexErr |
| </p> |
| </dd> |
| </dl><!-- reflect --> |
| |
| <dl id="regexp"><dt><a href="/pkg/regexp/">regexp</a></dt> |
| <dd> |
| <p><!-- CL 354569 --> |
| TODO: <a href="https://golang.org/cl/354569">https://golang.org/cl/354569</a>: document and implement that invalid UTF-8 bytes are the same as U+FFFD |
| </p> |
| </dd> |
| </dl><!-- regexp --> |
| |
| <dl id="strconv"><dt><a href="/pkg/strconv/">strconv</a></dt> |
| <dd> |
| <p><!-- CL 343877 --> |
| TODO: <a href="https://golang.org/cl/343877">https://golang.org/cl/343877</a>: reject surrogate halves in Unquote |
| </p> |
| </dd> |
| </dl><!-- strconv --> |
| |
| <dl id="strings"><dt><a href="/pkg/strings/">strings</a></dt> |
| <dd> |
| <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 332771 --> |
| <a href="/pkg/bytes#Trim"><code>strings.Trim</code></a> and related functions |
| functions, have had their most common use cases optimized. |
| </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 --> |
| TODO: <a href="https://golang.org/cl/319769">https://golang.org/cl/319769</a>: add Mutex.TryLock, RWMutex.TryLock, RWMutex.TryRLock |
| </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 --> |
| TODO: <a href="https://golang.org/cl/355570">https://golang.org/cl/355570</a>: add support for SysProcAttr.Pdeathsig on FreeBSD |
| </p> |
| </dd> |
| </dl><!-- syscall --> |
| |
| <dl id="syscall/js"><dt><a href="/pkg/syscall/js/">syscall/js</a></dt> |
| <dd> |
| <p><!-- CL 356430 --> |
| TODO: <a href="https://golang.org/cl/356430">https://golang.org/cl/356430</a>: remove Wrapper interface |
| </p> |
| </dd> |
| </dl><!-- syscall/js --> |
| |
| <dl id="testing"><dt><a href="/pkg/testing/">testing</a></dt> |
| <dd> |
| <p><!-- CL 343883 --> |
| TODO: <a href="https://golang.org/cl/343883">https://golang.org/cl/343883</a>: increase alternation precedence |
| </p> |
| |
| <p><!-- CL 356669 --> |
| TODO: <a href="https://golang.org/cl/356669">https://golang.org/cl/356669</a>: skip extra -count iterations if there are no tests |
| </p> |
| </dd> |
| </dl><!-- testing --> |
| |
| <dl id="text/template"><dt><a href="/pkg/text/template/">text/template</a></dt> |
| <dd> |
| <p><!-- CL 321490 --> |
| TODO: <a href="https://golang.org/cl/321490">https://golang.org/cl/321490</a>: implement short-circuit and, or |
| </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 --> |