| <!--{ | |
| "Title": "Go 1.16 Release Notes" | |
| }--> | |
| <!-- | |
| 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.16</h2> | |
| <p> | |
| The latest Go release, version 1.16, arrives six months after <a href="/doc/go1.15">Go 1.15</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.html">promise of compatibility</a>. | |
| We expect almost all Go programs to continue to compile and run as before. | |
| </p> | |
| <h2 id="language">Changes to the language</h2> | |
| <p> | |
| There are no changes to the language. | |
| </p> | |
| <h2 id="ports">Ports</h2> | |
| <h3 id="darwin">Darwin and iOS</h3> | |
| <p><!-- golang.org/issue/38485, golang.org/issue/41385, CL 266373, more CLs --> | |
| Go 1.16 adds support of 64-bit ARM architecture on macOS (also known as | |
| Apple Silicon) with <code>GOOS=darwin</code>, <code>GOARCH=arm64</code>. | |
| Like the <code>darwin/amd64</code> port, the <code>darwin/arm64</code> | |
| port supports cgo, internal and external linking, <code>c-archive</code>, | |
| <code>c-shared</code>, and <code>pie</code> build modes, and the race | |
| detector. | |
| </p> | |
| <p><!-- CL 254740 --> | |
| The iOS port, which was previously <code>darwin/arm64</code>, has | |
| been renamed to <code>ios/arm64</code>. <code>GOOS=ios</code> | |
| implies the | |
| <code>darwin</code> build tag, just as <code>GOOS=android</code> | |
| implies the <code>linux</code> build tag. This change should be | |
| transparent to anyone using gomobile to build iOS apps. | |
| </p> | |
| <p> | |
| The introduction of <code>GOOS=ios</code> means that file names | |
| like <code>x_ios.go</code> will now only be built for | |
| <code>GOOS=ios</code>; see | |
| <a href="/cmd/go/#hdr-Build_constraints"><code>go</code> | |
| <code>help</code> <code>buildconstraint</code></a> for details. | |
| Existing packages that use file names of this form will have to | |
| rename the files. | |
| </p> | |
| <p><!-- golang.org/issue/42100, CL 263798 --> | |
| Go 1.16 adds an <code>ios/amd64</code> port, which targets the iOS | |
| simulator running on AMD64-based macOS. Previously this was | |
| unofficially supported through <code>darwin/amd64</code> with | |
| the <code>ios</code> build tag set. See also | |
| <a href="/misc/ios/README"><code>misc/ios/README</code></a> for | |
| details about how to build programs for iOS and iOS simulator. | |
| </p> | |
| <p><!-- golang.org/issue/23011 --> | |
| Go 1.16 is the last release that will run on macOS 10.12 Sierra. | |
| Go 1.17 will require macOS 10.13 High Sierra or later. | |
| </p> | |
| <h3 id="netbsd">NetBSD</h3> | |
| <p><!-- golang.org/issue/30824 --> | |
| Go now supports the 64-bit ARM architecture on NetBSD (the | |
| <code>netbsd/arm64</code> port). | |
| </p> | |
| <h3 id="openbsd">OpenBSD</h3> | |
| <p><!-- golang.org/issue/40995 --> | |
| Go now supports the MIPS64 architecture on OpenBSD | |
| (the <code>openbsd/mips64</code> port). This port does not yet | |
| support cgo. | |
| </p> | |
| <p><!-- golang.org/issue/36435, many CLs --> | |
| On the 64-bit x86 and 64-bit ARM architectures on OpenBSD (the | |
| <code>openbsd/amd64</code> and <code>openbsd/arm64</code> ports), system | |
| calls are now made through <code>libc</code>, instead of directly using | |
| the <code>SYSCALL</code>/<code>SVC</code> instruction. This ensures | |
| forward-compatibility with future versions of OpenBSD. In particular, | |
| OpenBSD 6.9 onwards will require system calls to be made through | |
| <code>libc</code> for non-static Go binaries. | |
| </p> | |
| <h3 id="386">386</h3> | |
| <p><!-- golang.org/issue/40255, golang.org/issue/41848, CL 258957, and CL 260017 --> | |
| As <a href="go1.15#386">announced</a> in the Go 1.15 release notes, | |
| Go 1.16 drops support for x87 mode compilation (<code>GO386=387</code>). | |
| Support for non-SSE2 processors is now available using soft float | |
| mode (<code>GO386=softfloat</code>). | |
| Users running on non-SSE2 processors should replace <code>GO386=387</code> | |
| with <code>GO386=softfloat</code>. | |
| </p> | |
| <h3 id="riscv">RISC-V</h3> | |
| <p><!-- golang.org/issue/36641, CL 267317 --> | |
| The <code>linux/riscv64</code> port now supports cgo and | |
| <code>-buildmode=pie</code>. This release also includes performance | |
| optimizations and code generation improvements for RISC-V. | |
| </p> | |
| <h2 id="tools">Tools</h2> | |
| <h3 id="go-command">Go command</h3> | |
| <h4 id="modules">Modules</h4> | |
| <p><!-- golang.org/issue/41330 --> | |
| Module-aware mode is enabled by default, regardless of whether a | |
| <code>go.mod</code> file is present in the current working directory or a | |
| parent directory. More precisely, the <code>GO111MODULE</code> environment | |
| variable now defaults to <code>on</code>. To switch to the previous behavior, | |
| set <code>GO111MODULE</code> to <code>auto</code>. | |
| </p> | |
| <p><!-- golang.org/issue/40728 --> | |
| Build commands like <code>go</code> <code>build</code> and <code>go</code> | |
| <code>test</code> no longer modify <code>go.mod</code> and <code>go.sum</code> | |
| by default. Instead, they report an error if a module requirement or checksum | |
| needs to be added or updated (as if the <code>-mod=readonly</code> flag were | |
| used). Module requirements and sums may be adjusted with <code>go</code> | |
| <code>mod</code> <code>tidy</code> or <code>go</code> <code>get</code>. | |
| </p> | |
| <p><!-- golang.org/issue/40276 --> | |
| <code>go</code> <code>install</code> now accepts arguments with | |
| version suffixes (for example, <code>go</code> <code>install</code> | |
| <code>example.com/cmd@v1.0.0</code>). This causes <code>go</code> | |
| <code>install</code> to build and install packages in module-aware mode, | |
| ignoring the <code>go.mod</code> file in the current directory or any parent | |
| directory, if there is one. This is useful for installing executables without | |
| affecting the dependencies of the main module. | |
| </p> | |
| <p><!-- golang.org/issue/40276 --> | |
| <code>go</code> <code>install</code>, with or without a version suffix (as | |
| described above), is now the recommended way to build and install packages in | |
| module mode. <code>go</code> <code>get</code> should be used with the | |
| <code>-d</code> flag to adjust the current module's dependencies without | |
| building packages, and use of <code>go</code> <code>get</code> to build and | |
| install packages is deprecated. In a future release, the <code>-d</code> flag | |
| will always be enabled. | |
| </p> | |
| <p><!-- golang.org/issue/24031 --> | |
| <code>retract</code> directives may now be used in a <code>go.mod</code> file | |
| to indicate that certain published versions of the module should not be used | |
| by other modules. A module author may retract a version after a severe problem | |
| is discovered or if the version was published unintentionally. | |
| </p> | |
| <p><!-- golang.org/issue/26603 --> | |
| The <code>go</code> <code>mod</code> <code>vendor</code> | |
| and <code>go</code> <code>mod</code> <code>tidy</code> subcommands now accept | |
| the <code>-e</code> flag, which instructs them to proceed despite errors in | |
| resolving missing packages. | |
| </p> | |
| <p><!-- golang.org/issue/36465 --> | |
| The <code>go</code> command now ignores requirements on module versions | |
| excluded by <code>exclude</code> directives in the main module. Previously, | |
| the <code>go</code> command used the next version higher than an excluded | |
| version, but that version could change over time, resulting in | |
| non-reproducible builds. | |
| </p> | |
| <p><!-- golang.org/issue/43052, golang.org/issue/43985 --> | |
| In module mode, the <code>go</code> command now disallows import paths that | |
| include non-ASCII characters or path elements with a leading dot character | |
| (<code>.</code>). Module paths with these characters were already disallowed | |
| (see <a href="/ref/mod#go-mod-file-ident">Module paths and versions</a>), | |
| so this change affects only paths within module subdirectories. | |
| </p> | |
| <h4 id="embed">Embedding Files</h4> | |
| <p> | |
| The <code>go</code> command now supports including | |
| static files and file trees as part of the final executable, | |
| using the new <code>//go:embed</code> directive. | |
| See the documentation for the new | |
| <a href="/pkg/embed/"><code>embed</code></a> | |
| package for details. | |
| </p> | |
| <h4 id="go-test"><code>go</code> <code>test</code></h4> | |
| <p><!-- golang.org/issue/29062 --> | |
| When using <code>go</code> <code>test</code>, a test that | |
| calls <code>os.Exit(0)</code> during execution of a test function | |
| will now be considered to fail. | |
| This will help catch cases in which a test calls code that calls | |
| <code>os.Exit(0)</code> and thereby stops running all future tests. | |
| If a <code>TestMain</code> function calls <code>os.Exit(0)</code> | |
| that is still considered to be a passing test. | |
| </p> | |
| <p><!-- golang.org/issue/39484 --> | |
| <code>go</code> <code>test</code> reports an error when the <code>-c</code> | |
| or <code>-i</code> flags are used together with unknown flags. Normally, | |
| unknown flags are passed to tests, but when <code>-c</code> or <code>-i</code> | |
| are used, tests are not run. | |
| </p> | |
| <h4 id="go-get"><code>go</code> <code>get</code></h4> | |
| <p><!-- golang.org/issue/37519 --> | |
| The <code>go</code> <code>get</code> <code>-insecure</code> flag is | |
| deprecated and will be removed in a future version. This flag permits | |
| fetching from repositories and resolving custom domains using insecure | |
| schemes such as HTTP, and also bypasses module sum validation using the | |
| checksum database. To permit the use of insecure schemes, use the | |
| <code>GOINSECURE</code> environment variable instead. To bypass module | |
| sum validation, use <code>GOPRIVATE</code> or <code>GONOSUMDB</code>. | |
| See <code>go</code> <code>help</code> <code>environment</code> for details. | |
| </p> | |
| <p><!-- golang.org/cl/263267 --> | |
| <code>go</code> <code>get</code> <code>example.com/mod@patch</code> now | |
| requires that some version of <code>example.com/mod</code> already be | |
| required by the main module. | |
| (However, <code>go</code> <code>get</code> <code>-u=patch</code> continues | |
| to patch even newly-added dependencies.) | |
| </p> | |
| <h4 id="govcs"><code>GOVCS</code> environment variable</h4> | |
| <p><!-- golang.org/issue/266420 --> | |
| <code>GOVCS</code> is a new environment variable that limits which version | |
| control tools the <code>go</code> command may use to download source code. | |
| This mitigates security issues with tools that are typically used in trusted, | |
| authenticated environments. By default, <code>git</code> and <code>hg</code> | |
| may be used to download code from any repository. <code>svn</code>, | |
| <code>bzr</code>, and <code>fossil</code> may only be used to download code | |
| from repositories with module paths or package paths matching patterns in | |
| the <code>GOPRIVATE</code> environment variable. See | |
| <a href="/cmd/go/#hdr-Controlling_version_control_with_GOVCS"><code>go</code> | |
| <code>help</code> <code>vcs</code></a> for details. | |
| </p> | |
| <h4 id="all-pattern">The <code>all</code> pattern</h4> | |
| <p><!-- golang.org/cl/240623 --> | |
| When the main module's <code>go.mod</code> file | |
| declares <code>go</code> <code>1.16</code> or higher, the <code>all</code> | |
| package pattern now matches only those packages that are transitively imported | |
| by a package or test found in the main module. (Packages imported by <em>tests | |
| of</em> packages imported by the main module are no longer included.) This is | |
| the same set of packages retained | |
| by <code>go</code> <code>mod</code> <code>vendor</code> since Go 1.11. | |
| </p> | |
| <h4 id="toolexec">The <code>-toolexec</code> build flag</h4> | |
| <p><!-- golang.org/cl/263357 --> | |
| When the <code>-toolexec</code> build flag is specified to use a program when | |
| invoking toolchain programs like compile or asm, the environment variable | |
| <code>TOOLEXEC_IMPORTPATH</code> is now set to the import path of the package | |
| being built. | |
| </p> | |
| <h4 id="i-flag">The <code>-i</code> build flag</h4> | |
| <p><!-- golang.org/issue/41696 --> | |
| The <code>-i</code> flag accepted by <code>go</code> <code>build</code>, | |
| <code>go</code> <code>install</code>, and <code>go</code> <code>test</code> is | |
| now deprecated. The <code>-i</code> flag instructs the <code>go</code> command | |
| to install packages imported by packages named on the command line. Since | |
| the build cache was introduced in Go 1.10, the <code>-i</code> flag no longer | |
| has a significant effect on build times, and it causes errors when the install | |
| directory is not writable. | |
| </p> | |
| <h4 id="list-buildid">The <code>list</code> command</h4> | |
| <p><!-- golang.org/cl/263542 --> | |
| When the <code>-export</code> flag is specified, the <code>BuildID</code> | |
| field is now set to the build ID of the compiled package. This is equivalent | |
| to running <code>go</code> <code>tool</code> <code>buildid</code> on | |
| <code>go</code> <code>list</code> <code>-exported</code> <code>-f</code> <code>{{.Export}}</code>, | |
| but without the extra step. | |
| </p> | |
| <h4 id="overlay-flag">The <code>-overlay</code> flag</h4> | |
| <p><!-- golang.org/issue/39958 --> | |
| The <code>-overlay</code> flag specifies a JSON configuration file containing | |
| a set of file path replacements. The <code>-overlay</code> flag may be used | |
| with all build commands and <code>go</code> <code>mod</code> subcommands. | |
| It is primarily intended to be used by editor tooling such as gopls to | |
| understand the effects of unsaved changes to source files. The config file | |
| maps actual file paths to replacement file paths and the <code>go</code> | |
| command and its builds will run as if the actual file paths exist with the | |
| contents given by the replacement file paths, or don't exist if the replacement | |
| file paths are empty. | |
| </p> | |
| <h3 id="cgo">Cgo</h3> | |
| <p><!-- CL 252378 --> | |
| The <a href="/cmd/cgo">cgo</a> tool will no longer try to translate | |
| C struct bitfields into Go struct fields, even if their size can be | |
| represented in Go. The order in which C bitfields appear in memory | |
| is implementation dependent, so in some cases the cgo tool produced | |
| results that were silently incorrect. | |
| </p> | |
| <h3 id="vet">Vet</h3> | |
| <h4 id="vet-testing-T">New warning for invalid testing.T use in | |
| goroutines</h4> | |
| <p><!-- CL 235677 --> | |
| The vet tool now warns about invalid calls to the <code>testing.T</code> | |
| method <code>Fatal</code> from within a goroutine created during the test. | |
| This also warns on calls to <code>Fatalf</code>, <code>FailNow</code>, and | |
| <code>Skip{,f,Now}</code> methods on <code>testing.T</code> tests or | |
| <code>testing.B</code> benchmarks. | |
| </p> | |
| <p> | |
| Calls to these methods stop the execution of the created goroutine and not | |
| the <code>Test*</code> or <code>Benchmark*</code> function. So these are | |
| <a href="/pkg/testing/#T.FailNow">required</a> to be called by the goroutine | |
| running the test or benchmark function. For example: | |
| </p> | |
| <pre> | |
| func TestFoo(t *testing.T) { | |
| go func() { | |
| if condition() { | |
| t.Fatal("oops") // This exits the inner func instead of TestFoo. | |
| } | |
| ... | |
| }() | |
| } | |
| </pre> | |
| <p> | |
| Code calling <code>t.Fatal</code> (or a similar method) from a created | |
| goroutine should be rewritten to signal the test failure using | |
| <code>t.Error</code> and exit the goroutine early using an alternative | |
| method, such as using a <code>return</code> statement. The previous example | |
| could be rewritten as: | |
| </p> | |
| <pre> | |
| func TestFoo(t *testing.T) { | |
| go func() { | |
| if condition() { | |
| t.Error("oops") | |
| return | |
| } | |
| ... | |
| }() | |
| } | |
| </pre> | |
| <h4 id="vet-frame-pointer">New warning for frame pointer</h4> | |
| <p><!-- CL 248686, CL 276372 --> | |
| The vet tool now warns about amd64 assembly that clobbers the BP | |
| register (the frame pointer) without saving and restoring it, | |
| contrary to the calling convention. Code that doesn't preserve the | |
| BP register must be modified to either not use BP at all or preserve | |
| BP by saving and restoring it. An easy way to preserve BP is to set | |
| the frame size to a nonzero value, which causes the generated | |
| prologue and epilogue to preserve the BP register for you. | |
| See <a href="https://golang.org/cl/248260">CL 248260</a> for example | |
| fixes. | |
| </p> | |
| <h4 id="vet-asn1-unmarshal">New warning for asn1.Unmarshal</h4> | |
| <p><!-- CL 243397 --> | |
| The vet tool now warns about incorrectly passing a non-pointer or nil argument to | |
| <a href="/pkg/encoding/asn1/#Unmarshal"><code>asn1.Unmarshal</code></a>. | |
| This is like the existing checks for | |
| <a href="/pkg/encoding/json/#Unmarshal"><code>encoding/json.Unmarshal</code></a> | |
| and <a href="/pkg/encoding/xml/#Unmarshal"><code>encoding/xml.Unmarshal</code></a>. | |
| </p> | |
| <h2 id="runtime">Runtime</h2> | |
| <p> | |
| The new <a href="/pkg/runtime/metrics/"><code>runtime/metrics</code></a> package | |
| introduces a stable interface for reading | |
| implementation-defined metrics from the Go runtime. | |
| It supersedes existing functions like | |
| <a href="/pkg/runtime/#ReadMemStats"><code>runtime.ReadMemStats</code></a> | |
| and | |
| <a href="/pkg/runtime/debug/#GCStats"><code>debug.GCStats</code></a> | |
| and is significantly more general and efficient. | |
| See the package documentation for more details. | |
| </p> | |
| <p><!-- CL 254659 --> | |
| Setting the <code>GODEBUG</code> environment variable | |
| to <code>inittrace=1</code> now causes the runtime to emit a single | |
| line to standard error for each package <code>init</code>, | |
| summarizing its execution time and memory allocation. This trace can | |
| be used to find bottlenecks or regressions in Go startup | |
| performance. | |
| The <a href="/pkg/runtime/#hdr-Environment_Variables"><code>GODEBUG</code> | |
| documentation</a> describes the format. | |
| </p> | |
| <p><!-- CL 267100 --> | |
| On Linux, the runtime now defaults to releasing memory to the | |
| operating system promptly (using <code>MADV_DONTNEED</code>), rather | |
| than lazily when the operating system is under memory pressure | |
| (using <code>MADV_FREE</code>). This means process-level memory | |
| statistics like RSS will more accurately reflect the amount of | |
| physical memory being used by Go processes. Systems that are | |
| currently using <code>GODEBUG=madvdontneed=1</code> to improve | |
| memory monitoring behavior no longer need to set this environment | |
| variable. | |
| </p> | |
| <p><!-- CL 220419, CL 271987 --> | |
| Go 1.16 fixes a discrepancy between the race detector and | |
| the <a href="/ref/mem">Go memory model</a>. The race detector now | |
| more precisely follows the channel synchronization rules of the | |
| memory model. As a result, the detector may now report races it | |
| previously missed. | |
| </p> | |
| <h2 id="compiler">Compiler</h2> | |
| <p><!-- CL 256459, CL 264837, CL 266203, CL 256460 --> | |
| The compiler can now inline functions with | |
| non-labeled <code>for</code> loops, method values, and type | |
| switches. The inliner can also detect more indirect calls where | |
| inlining is possible. | |
| </p> | |
| <h2 id="linker">Linker</h2> | |
| <p><!-- CL 248197 --> | |
| This release includes additional improvements to the Go linker, | |
| reducing linker resource usage (both time and memory) and improving | |
| code robustness/maintainability. These changes form the second half | |
| of a two-release project to | |
| <a href="https://golang.org/s/better-linker">modernize the Go | |
| linker</a>. | |
| </p> | |
| <p> | |
| The linker changes in 1.16 extend the 1.15 improvements to all | |
| supported architecture/OS combinations (the 1.15 performance improvements | |
| were primarily focused on <code>ELF</code>-based OSes and | |
| <code>amd64</code> architectures). For a representative set of | |
| large Go programs, linking is 20-25% faster than 1.15 and requires | |
| 5-15% less memory on average for <code>linux/amd64</code>, with larger | |
| improvements for other architectures and OSes. Most binaries are | |
| also smaller as a result of more aggressive symbol pruning. | |
| </p> | |
| <p><!-- CL 255259 --> | |
| On Windows, <code>go build -buildmode=c-shared</code> now generates Windows | |
| ASLR DLLs by default. ASLR can be disabled with <code>--ldflags=-aslr=false</code>. | |
| </p> | |
| <h2 id="library">Core library</h2> | |
| <h3 id="library-embed">Embedded Files</h3> | |
| <p> | |
| The new <a href="/pkg/embed/"><code>embed</code></a> package | |
| provides access to files embedded in the program during compilation | |
| using the new <a href="#embed"><code>//go:embed</code> directive</a>. | |
| </p> | |
| <h3 id="fs">File Systems</h3> | |
| <p> | |
| The new <a href="/pkg/io/fs/"><code>io/fs</code></a> package | |
| defines the <a href="/pkg/io/fs/#FS"><code>fs.FS</code></a> interface, | |
| an abstraction for read-only trees of files. | |
| The standard library packages have been adapted to make use | |
| of the interface as appropriate. | |
| </p> | |
| <p> | |
| On the producer side of the interface, | |
| the new <a href="/pkg/embed/#FS"><code>embed.FS</code></a> type | |
| implements <code>fs.FS</code>, as does | |
| <a href="/pkg/archive/zip/#Reader"><code>zip.Reader</code></a>. | |
| The new <a href="/pkg/os/#DirFS"><code>os.DirFS</code></a> function | |
| provides an implementation of <code>fs.FS</code> backed by a tree | |
| of operating system files. | |
| </p> | |
| <p> | |
| On the consumer side, | |
| the new <a href="/pkg/net/http/#FS"><code>http.FS</code></a> | |
| function converts an <code>fs.FS</code> to an | |
| <a href="/pkg/net/http/#FileSystem"><code>http.FileSystem</code></a>. | |
| Also, the <a href="/pkg/html/template/"><code>html/template</code></a> | |
| and <a href="/pkg/text/template/"><code>text/template</code></a> | |
| packages’ <a href="/pkg/html/template/#ParseFS"><code>ParseFS</code></a> | |
| functions and methods read templates from an <code>fs.FS</code>. | |
| </p> | |
| <p> | |
| For testing code that implements <code>fs.FS</code>, | |
| the new <a href="/pkg/testing/fstest/"><code>testing/fstest</code></a> | |
| package provides a <a href="/pkg/testing/fstest/#TestFS"><code>TestFS</code></a> | |
| function that checks for and reports common mistakes. | |
| It also provides a simple in-memory file system implementation, | |
| <a href="/pkg/testing/fstest/#MapFS"><code>MapFS</code></a>, | |
| which can be useful for testing code that accepts <code>fs.FS</code> | |
| implementations. | |
| </p> | |
| <h3 id="ioutil">Deprecation of io/ioutil</h3> | |
| <p> | |
| The <a href="/pkg/io/ioutil/"><code>io/ioutil</code></a> package has | |
| turned out to be a poorly defined and hard to understand collection | |
| of things. All functionality provided by the package has been moved | |
| to other packages. The <code>io/ioutil</code> package remains and | |
| will continue to work as before, but we encourage new code to use | |
| the new definitions in the <a href="/pkg/io/"><code>io</code></a> and | |
| <a href="/pkg/os/"><code>os</code></a> packages. | |
| Here is a list of the new locations of the names exported | |
| by <code>io/ioutil</code>: | |
| <ul> | |
| <li><a href="/pkg/io/ioutil/#Discard"><code>Discard</code></a> | |
| => <a href="/pkg/io/#Discard"><code>io.Discard</code></a></li> | |
| <li><a href="/pkg/io/ioutil/#NopCloser"><code>NopCloser</code></a> | |
| => <a href="/pkg/io/#NopCloser"><code>io.NopCloser</code></a></li> | |
| <li><a href="/pkg/io/ioutil/#ReadAll"><code>ReadAll</code></a> | |
| => <a href="/pkg/io/#ReadAll"><code>io.ReadAll</code></a></li> | |
| <li><a href="/pkg/io/ioutil/#ReadDir"><code>ReadDir</code></a> | |
| => <a href="/pkg/os/#ReadDir"><code>os.ReadDir</code></a> | |
| (note: returns a slice of | |
| <a href="/pkg/os/#DirEntry"><code>os.DirEntry</code></a> | |
| rather than a slice of | |
| <a href="/pkg/io/fs/#FileInfo"><code>fs.FileInfo</code></a>) | |
| </li> | |
| <li><a href="/pkg/io/ioutil/#ReadFile"><code>ReadFile</code></a> | |
| => <a href="/pkg/os/#ReadFile"><code>os.ReadFile</code></a></li> | |
| <li><a href="/pkg/io/ioutil/#TempDir"><code>TempDir</code></a> | |
| => <a href="/pkg/os/#MkdirTemp"><code>os.MkdirTemp</code></a></li> | |
| <li><a href="/pkg/io/ioutil/#TempFile"><code>TempFile</code></a> | |
| => <a href="/pkg/os/#CreateTemp"><code>os.CreateTemp</code></a></li> | |
| <li><a href="/pkg/io/ioutil/#WriteFile"><code>WriteFile</code></a> | |
| => <a href="/pkg/os/#WriteFile"><code>os.WriteFile</code></a></li> | |
| </ul> | |
| </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> | |
| <dl id="archive/zip"><dt><a href="/pkg/archive/zip/">archive/zip</a></dt> | |
| <dd> | |
| <p><!-- CL 243937 --> | |
| The new <a href="/pkg/archive/zip/#Reader.Open"><code>Reader.Open</code></a> | |
| method implements the <a href="/pkg/io/fs/#FS"><code>fs.FS</code></a> | |
| interface. | |
| </p> | |
| </dd> | |
| </dl> | |
| <dl id="crypto/dsa"><dt><a href="/pkg/crypto/dsa/">crypto/dsa</a></dt> | |
| <dd> | |
| <p><!-- CL 257939 --> | |
| The <a href="/pkg/crypto/dsa/"><code>crypto/dsa</code></a> package is now deprecated. | |
| See <a href="https://golang.org/issue/40337">issue #40337</a>. | |
| </p> | |
| </dd> | |
| </dl><!-- crypto/dsa --> | |
| <dl id="crypto/hmac"><dt><a href="/pkg/crypto/hmac/">crypto/hmac</a></dt> | |
| <dd> | |
| <p><!-- CL 261960 --> | |
| <a href="/pkg/crypto/hmac/#New"><code>New</code></a> will now panic if | |
| separate calls to the hash generation function fail to return new values. | |
| Previously, the behavior was undefined and invalid outputs were sometimes | |
| generated. | |
| </p> | |
| </dd> | |
| </dl><!-- crypto/hmac --> | |
| <dl id="crypto/tls"><dt><a href="/pkg/crypto/tls/">crypto/tls</a></dt> | |
| <dd> | |
| <p><!-- CL 256897 --> | |
| I/O operations on closing or closed TLS connections can now be detected | |
| using the new <a href="/pkg/net/#ErrClosed"><code>net.ErrClosed</code></a> | |
| error. A typical use would be <code>errors.Is(err, net.ErrClosed)</code>. | |
| </p> | |
| <p><!-- CL 266037 --> | |
| A default write deadline is now set in | |
| <a href="/pkg/crypto/tls/#Conn.Close"><code>Conn.Close</code></a> | |
| before sending the "close notify" alert, in order to prevent blocking | |
| indefinitely. | |
| </p> | |
| <p><!-- CL 239748 --> | |
| Clients now return a handshake error if the server selects | |
| <a href="/pkg/crypto/tls/#ConnectionState.NegotiatedProtocol"> | |
| an ALPN protocol</a> that was not in | |
| <a href="/pkg/crypto/tls/#Config.NextProtos"> | |
| the list advertised by the client</a>. | |
| </p> | |
| <p><!-- CL 262857 --> | |
| Servers will now prefer other available AEAD cipher suites (such as ChaCha20Poly1305) | |
| over AES-GCM cipher suites if either the client or server doesn't have AES hardware | |
| support, unless both <a href="/pkg/crypto/tls/#Config.PreferServerCipherSuites"> | |
| <code>Config.PreferServerCipherSuites</code></a> | |
| and <a href="/pkg/crypto/tls/#Config.CipherSuites"><code>Config.CipherSuites</code></a> | |
| are set. The client is assumed not to have AES hardware support if it does | |
| not signal a preference for AES-GCM cipher suites. | |
| </p> | |
| <p><!-- CL 246637 --> | |
| <a href="/pkg/crypto/tls/#Config.Clone"><code>Config.Clone</code></a> now | |
| returns nil if the receiver is nil, rather than panicking. | |
| </p> | |
| </dd> | |
| </dl><!-- crypto/tls --> | |
| <dl id="crypto/x509"><dt><a href="/pkg/crypto/x509/">crypto/x509</a></dt> | |
| <dd> | |
| <p> | |
| The <code>GODEBUG=x509ignoreCN=0</code> flag will be removed in Go 1.17. | |
| It enables the legacy behavior of treating the <code>CommonName</code> | |
| field on X.509 certificates as a host name when no Subject Alternative | |
| Names are present. | |
| </p> | |
| <p><!-- CL 235078 --> | |
| <a href="/pkg/crypto/x509/#ParseCertificate"><code>ParseCertificate</code></a> and | |
| <a href="/pkg/crypto/x509/#CreateCertificate"><code>CreateCertificate</code></a> | |
| now enforce string encoding restrictions for the <code>DNSNames</code>, | |
| <code>EmailAddresses</code>, and <code>URIs</code> fields. These fields | |
| can only contain strings with characters within the ASCII range. | |
| </p> | |
| <p><!-- CL 259697 --> | |
| <a href="/pkg/crypto/x509/#CreateCertificate"><code>CreateCertificate</code></a> | |
| now verifies the generated certificate's signature using the signer's | |
| public key. If the signature is invalid, an error is returned, instead of | |
| a malformed certificate. | |
| </p> | |
| <p><!-- CL 257939 --> | |
| DSA signature verification is no longer supported. Note that DSA signature | |
| generation was never supported. | |
| See <a href="https://golang.org/issue/40337">issue #40337</a>. | |
| </p> | |
| <p><!-- CL 257257 --> | |
| On Windows, <a href="/pkg/crypto/x509/#Certificate.Verify"><code>Certificate.Verify</code></a> | |
| will now return all certificate chains that are built by the platform | |
| certificate verifier, instead of just the highest ranked chain. | |
| </p> | |
| <p><!-- CL 262343 --> | |
| The new <a href="/pkg/crypto/x509/#SystemRootsError.Unwrap"><code>SystemRootsError.Unwrap</code></a> | |
| method allows accessing the <a href="/pkg/crypto/x509/#SystemRootsError.Err"><code>Err</code></a> | |
| field through the <a href="/pkg/errors"><code>errors</code></a> package functions. | |
| </p> | |
| <p><!-- CL 230025 --> | |
| On Unix systems, the <code>crypto/x509</code> package is now more | |
| efficient in how it stores its copy of the system cert pool. | |
| Programs that use only a small number of roots will use around a | |
| half megabyte less memory. | |
| </p> | |
| </dd> | |
| </dl><!-- crypto/x509 --> | |
| <dl id="debug/elf"><dt><a href="/pkg/debug/elf/">debug/elf</a></dt> | |
| <dd> | |
| <p><!-- CL 255138 --> | |
| More <a href="/pkg/debug/elf/#DT_NULL"><code>DT</code></a> | |
| and <a href="/pkg/debug/elf/#PT_NULL"><code>PT</code></a> | |
| constants have been added. | |
| </p> | |
| </dd> | |
| </dl><!-- debug/elf --> | |
| <dl id="encoding/asn1"><dt><a href="/pkg/encoding/asn1">encoding/asn1</a></dt> | |
| <dd> | |
| <p><!-- CL 255881 --> | |
| <a href="/pkg/encoding/asn1/#Unmarshal"><code>Unmarshal</code></a> and | |
| <a href="/pkg/encoding/asn1/#UnmarshalWithParams"><code>UnmarshalWithParams</code></a> | |
| now return an error instead of panicking when the argument is not | |
| a pointer or is nil. This change matches the behavior of other | |
| encoding packages such as <a href="/pkg/encoding/json"><code>encoding/json</code></a>. | |
| </p> | |
| </dd> | |
| </dl> | |
| <dl id="encoding/json"><dt><a href="/pkg/encoding/json/">encoding/json</a></dt> | |
| <dd> | |
| <p><!-- CL 234818 --> | |
| The <code>json</code> struct field tags understood by | |
| <a href="/pkg/encoding/json/#Marshal"><code>Marshal</code></a>, | |
| <a href="/pkg/encoding/json/#Unmarshal"><code>Unmarshal</code></a>, | |
| and related functionality now permit semicolon characters within | |
| a JSON object name for a Go struct field. | |
| </p> | |
| </dd> | |
| </dl><!-- encoding/json --> | |
| <dl id="encoding/xml"><dt><a href="/pkg/encoding/xml/">encoding/xml</a></dt> | |
| <dd> | |
| <p><!-- CL 264024 --> | |
| The encoder has always taken care to avoid using namespace prefixes | |
| beginning with <code>xml</code>, which are reserved by the XML | |
| specification. | |
| Now, following the specification more closely, that check is | |
| case-insensitive, so that prefixes beginning | |
| with <code>XML</code>, <code>XmL</code>, and so on are also | |
| avoided. | |
| </p> | |
| </dd> | |
| </dl><!-- encoding/xml --> | |
| <dl id="flag"><dt><a href="/pkg/flag/">flag</a></dt> | |
| <dd> | |
| <p><!-- CL 240014 --> | |
| The new <a href="/pkg/flag/#Func"><code>Func</code></a> function | |
| allows registering a flag implemented by calling a function, | |
| as a lighter-weight alternative to implementing the | |
| <a href="/pkg/flag/#Value"><code>Value</code></a> interface. | |
| </p> | |
| </dd> | |
| </dl><!-- flag --> | |
| <dl id="go/build"><dt><a href="/pkg/go/build/">go/build</a></dt> | |
| <dd> | |
| <p><!-- CL 243941, CL 283636 --> | |
| The <a href="/pkg/go/build/#Package"><code>Package</code></a> | |
| struct has new fields that report information | |
| about <code>//go:embed</code> directives in the package: | |
| <a href="/pkg/go/build/#Package.EmbedPatterns"><code>EmbedPatterns</code></a>, | |
| <a href="/pkg/go/build/#Package.EmbedPatternPos"><code>EmbedPatternPos</code></a>, | |
| <a href="/pkg/go/build/#Package.TestEmbedPatterns"><code>TestEmbedPatterns</code></a>, | |
| <a href="/pkg/go/build/#Package.TestEmbedPatternPos"><code>TestEmbedPatternPos</code></a>, | |
| <a href="/pkg/go/build/#Package.XTestEmbedPatterns"><code>XTestEmbedPatterns</code></a>, | |
| <a href="/pkg/go/build/#Package.XTestEmbedPatternPos"><code>XTestEmbedPatternPos</code></a>. | |
| </p> | |
| <p><!-- CL 240551 --> | |
| The <a href="/pkg/go/build/#Package"><code>Package</code></a> field | |
| <a href="/pkg/go/build/#Package.IgnoredGoFiles"><code>IgnoredGoFiles</code></a> | |
| will no longer include files that start with "_" or ".", | |
| as those files are always ignored. | |
| <code>IgnoredGoFiles</code> is for files ignored because of | |
| build constraints. | |
| </p> | |
| <p><!-- CL 240551 --> | |
| The new <a href="/pkg/go/build/#Package"><code>Package</code></a> | |
| field <a href="/pkg/go/build/#Package.IgnoredOtherFiles"><code>IgnoredOtherFiles</code></a> | |
| has a list of non-Go files ignored because of build constraints. | |
| </p> | |
| </dd> | |
| </dl><!-- go/build --> | |
| <dl id="go/build/constraint"><dt><a href="/pkg/go/build/constraint/">go/build/constraint</a></dt> | |
| <dd> | |
| <p><!-- CL 240604 --> | |
| The new | |
| <a href="/pkg/go/build/constraint/"><code>go/build/constraint</code></a> | |
| package parses build constraint lines, both the original | |
| <code>// +build</code> syntax and the <code>//go:build</code> | |
| syntax that will be introduced in Go 1.17. | |
| This package exists so that tools built with Go 1.16 will be able | |
| to process Go 1.17 source code. | |
| See <a href="https://golang.org/design/draft-gobuild">https://golang.org/design/draft-gobuild</a> | |
| for details about the build constraint syntaxes and the planned | |
| transition to the <code>//go:build</code> syntax. | |
| Note that <code>//go:build</code> lines are <b>not</b> supported | |
| in Go 1.16 and should not be introduced into Go programs yet. | |
| </p> | |
| </dd> | |
| </dl><!-- go/build/constraint --> | |
| <dl id="html/template"><dt><a href="/pkg/html/template/">html/template</a></dt> | |
| <dd> | |
| <p><!-- CL 243938 --> | |
| The new <a href="/pkg/html/template/#ParseFS"><code>template.ParseFS</code></a> | |
| function and <a href="/pkg/html/template/#Template.ParseFS"><code>template.Template.ParseFS</code></a> | |
| method are like <a href="/pkg/html/template/#ParseGlob"><code>template.ParseGlob</code></a> | |
| and <a href="/pkg/html/template/#Template.ParseGlob"><code>template.Template.ParseGlob</code></a>, | |
| but read the templates from an <a href="/pkg/io/fs/#FS"><code>fs.FS</code></a>. | |
| </p> | |
| </dd> | |
| </dl><!-- html/template --> | |
| <dl id="io"><dt><a href="/pkg/io/">io</a></dt> | |
| <dd> | |
| <p><!-- CL 261577 --> | |
| The package now defines a | |
| <a href="/pkg/io/#ReadSeekCloser"><code>ReadSeekCloser</code></a> interface. | |
| </p> | |
| <p><!-- CL 263141 --> | |
| The package now defines | |
| <a href="/pkg/io/#Discard"><code>Discard</code></a>, | |
| <a href="/pkg/io/#NopCloser"><code>NopCloser</code></a>, and | |
| <a href="/pkg/io/#ReadAll"><code>ReadAll</code></a>, | |
| to be used instead of the same names in the | |
| <a href="/pkg/io/ioutil/"><code>io/ioutil</code></a> package. | |
| </p> | |
| </dd> | |
| </dl><!-- io --> | |
| <dl id="log"><dt><a href="/pkg/log/">log</a></dt> | |
| <dd> | |
| <p><!-- CL 264460 --> | |
| The new <a href="/pkg/log/#Default"><code>Default</code></a> function | |
| provides access to the default <a href="/pkg/log/#Logger"><code>Logger</code></a>. | |
| </p> | |
| </dd> | |
| </dl><!-- log --> | |
| <dl id="log/syslog"><dt><a href="/pkg/log/syslog/">log/syslog</a></dt> | |
| <dd> | |
| <p><!-- CL 264297 --> | |
| The <a href="/pkg/log/syslog/#Writer"><code>Writer</code></a> | |
| now uses the local message format | |
| (omitting the host name and using a shorter time stamp) | |
| when logging to custom Unix domain sockets, | |
| matching the format already used for the default log socket. | |
| </p> | |
| </dd> | |
| </dl><!-- log/syslog --> | |
| <dl id="mime/multipart"><dt><a href="/pkg/mime/multipart/">mime/multipart</a></dt> | |
| <dd> | |
| <p><!-- CL 247477 --> | |
| The <a href="/pkg/mime/multipart/#Reader"><code>Reader</code></a>'s | |
| <a href="/pkg/mime/multipart/#Reader.ReadForm"><code>ReadForm</code></a> | |
| method no longer rejects form data | |
| when passed the maximum int64 value as a limit. | |
| </p> | |
| </dd> | |
| </dl><!-- mime/multipart --> | |
| <dl id="net"><dt><a href="/pkg/net/">net</a></dt> | |
| <dd> | |
| <p><!-- CL 250357 --> | |
| The case of I/O on a closed network connection, or I/O on a network | |
| connection that is closed before any of the I/O completes, can now | |
| be detected using the new <a href="/pkg/net/#ErrClosed"><code>ErrClosed</code></a> | |
| error. A typical use would be <code>errors.Is(err, net.ErrClosed)</code>. | |
| In earlier releases the only way to reliably detect this case was to | |
| match the string returned by the <code>Error</code> method | |
| with <code>"use of closed network connection"</code>. | |
| </p> | |
| <p><!-- CL 255898 --> | |
| In previous Go releases the default TCP listener backlog size on Linux systems, | |
| set by <code>/proc/sys/net/core/somaxconn</code>, was limited to a maximum of <code>65535</code>. | |
| On Linux kernel version 4.1 and above, the maximum is now <code>4294967295</code>. | |
| </p> | |
| <p><!-- CL 238629 --> | |
| On Linux, host name lookups no longer use DNS before checking | |
| <code>/etc/hosts</code> when <code>/etc/nsswitch.conf</code> | |
| is missing; this is common on musl-based systems and makes | |
| Go programs match the behavior of C programs on those systems. | |
| </p> | |
| </dd> | |
| </dl><!-- net --> | |
| <dl id="net/http"><dt><a href="/pkg/net/http/">net/http</a></dt> | |
| <dd> | |
| <p><!-- CL 233637 --> | |
| In the <a href="/pkg/net/http/"><code>net/http</code></a> package, the | |
| behavior of <a href="/pkg/net/http/#StripPrefix"><code>StripPrefix</code></a> | |
| has been changed to strip the prefix from the request URL's | |
| <code>RawPath</code> field in addition to its <code>Path</code> field. | |
| In past releases, only the <code>Path</code> field was trimmed, and so if the | |
| request URL contained any escaped characters the URL would be modified to | |
| have mismatched <code>Path</code> and <code>RawPath</code> fields. | |
| In Go 1.16, <code>StripPrefix</code> trims both fields. | |
| If there are escaped characters in the prefix part of the request URL the | |
| handler serves a 404 instead of its previous behavior of invoking the | |
| underlying handler with a mismatched <code>Path</code>/<code>RawPath</code> pair. | |
| </p> | |
| <p><!-- CL 252497 --> | |
| The <a href="/pkg/net/http/"><code>net/http</code></a> package now rejects HTTP range requests | |
| of the form <code>"Range": "bytes=--N"</code> where <code>"-N"</code> is a negative suffix length, for | |
| example <code>"Range": "bytes=--2"</code>. It now replies with a <code>416 "Range Not Satisfiable"</code> response. | |
| </p> | |
| <p><!-- CL 256498, golang.org/issue/36990 --> | |
| Cookies set with <a href="/pkg/net/http/#SameSiteDefaultMode"><code>SameSiteDefaultMode</code></a> | |
| now behave according to the current spec (no attribute is set) instead of | |
| generating a SameSite key without a value. | |
| </p> | |
| <p><!-- CL 250039 --> | |
| The <a href="/pkg/net/http/#Client"><code>Client</code></a> now sends | |
| an explicit <code>Content-Length:</code> <code>0</code> | |
| header in <code>PATCH</code> requests with empty bodies, | |
| matching the existing behavior of <code>POST</code> and <code>PUT</code>. | |
| </p> | |
| <p><!-- CL 249440 --> | |
| The <a href="/pkg/net/http/#ProxyFromEnvironment"><code>ProxyFromEnvironment</code></a> | |
| function no longer returns the setting of the <code>HTTP_PROXY</code> | |
| environment variable for <code>https://</code> URLs when | |
| <code>HTTPS_PROXY</code> is unset. | |
| </p> | |
| <p><!-- 259917 --> | |
| The <a href="/pkg/net/http/#Transport"><code>Transport</code></a> | |
| type has a new field | |
| <a href="/pkg/net/http/#Transport.GetProxyConnectHeader"><code>GetProxyConnectHeader</code></a> | |
| which may be set to a function that returns headers to send to a | |
| proxy during a <code>CONNECT</code> request. | |
| In effect <code>GetProxyConnectHeader</code> is a dynamic | |
| version of the existing field | |
| <a href="/pkg/net/http/#Transport.ProxyConnectHeader"><code>ProxyConnectHeader</code></a>; | |
| if <code>GetProxyConnectHeader</code> is not <code>nil</code>, | |
| then <code>ProxyConnectHeader</code> is ignored. | |
| </p> | |
| <p><!-- CL 243939 --> | |
| The new <a href="/pkg/net/http/#FS"><code>http.FS</code></a> | |
| function converts an <a href="/pkg/io/fs/#FS"><code>fs.FS</code></a> | |
| to an <a href="/pkg/net/http/#FileSystem"><code>http.FileSystem</code></a>. | |
| </p> | |
| </dd> | |
| </dl><!-- net/http --> | |
| <dl id="net/http/httputil"><dt><a href="/pkg/net/http/httputil/">net/http/httputil</a></dt> | |
| <dd> | |
| <p><!-- CL 260637 --> | |
| <a href="/pkg/net/http/httputil/#ReverseProxy"><code>ReverseProxy</code></a> | |
| now flushes buffered data more aggressively when proxying | |
| streamed responses with unknown body lengths. | |
| </p> | |
| </dd> | |
| </dl><!-- net/http/httputil --> | |
| <dl id="net/smtp"><dt><a href="/pkg/net/smtp/">net/smtp</a></dt> | |
| <dd> | |
| <p><!-- CL 247257 --> | |
| The <a href="/pkg/net/smtp/#Client"><code>Client</code></a>'s | |
| <a href="/pkg/net/smtp/#Client.Mail"><code>Mail</code></a> | |
| method now sends the <code>SMTPUTF8</code> directive to | |
| servers that support it, signaling that addresses are encoded in UTF-8. | |
| </p> | |
| </dd> | |
| </dl><!-- net/smtp --> | |
| <dl id="os"><dt><a href="/pkg/os/">os</a></dt> | |
| <dd> | |
| <p><!-- CL 242998 --> | |
| <a href="/pkg/os/#Process.Signal"><code>Process.Signal</code></a> now | |
| returns <a href="/pkg/os/#ErrProcessDone"><code>ErrProcessDone</code></a> | |
| instead of the unexported <code>errFinished</code> when the process has | |
| already finished. | |
| </p> | |
| <p><!-- CL 261540 --> | |
| The package defines a new type | |
| <a href="/pkg/os/#DirEntry"><code>DirEntry</code></a> | |
| as an alias for <a href="/pkg/io/fs/#DirEntry"><code>fs.DirEntry</code></a>. | |
| The new <a href="/pkg/os/#ReadDir"><code>ReadDir</code></a> | |
| function and the new | |
| <a href="/pkg/os/#File.ReadDir"><code>File.ReadDir</code></a> | |
| method can be used to read the contents of a directory into a | |
| slice of <a href="/pkg/os/#DirEntry"><code>DirEntry</code></a>. | |
| The <a href="/pkg/os/#File.Readdir"><code>File.Readdir</code></a> | |
| method (note the lower case <code>d</code> in <code>dir</code>) | |
| still exists, returning a slice of | |
| <a href="/pkg/os/#FileInfo"><code>FileInfo</code></a>, but for | |
| most programs it will be more efficient to switch to | |
| <a href="/pkg/os/#File.ReadDir"><code>File.ReadDir</code></a>. | |
| </p> | |
| <p><!-- CL 263141 --> | |
| The package now defines | |
| <a href="/pkg/os/#CreateTemp"><code>CreateTemp</code></a>, | |
| <a href="/pkg/os/#MkdirTemp"><code>MkdirTemp</code></a>, | |
| <a href="/pkg/os/#ReadFile"><code>ReadFile</code></a>, and | |
| <a href="/pkg/os/#WriteFile"><code>WriteFile</code></a>, | |
| to be used instead of functions defined in the | |
| <a href="/pkg/io/ioutil/"><code>io/ioutil</code></a> package. | |
| </p> | |
| <p><!-- CL 243906 --> | |
| The types <a href="/pkg/os/#FileInfo"><code>FileInfo</code></a>, | |
| <a href="/pkg/os/#FileMode"><code>FileMode</code></a>, and | |
| <a href="/pkg/os/#PathError"><code>PathError</code></a> | |
| are now aliases for types of the same name in the | |
| <a href="/pkg/io/fs/"><code>io/fs</code></a> package. | |
| Function signatures in the <a href="/pkg/os/"><code>os</code></a> | |
| package have been updated to refer to the names in the | |
| <a href="/pkg/io/fs/"><code>io/fs</code></a> package. | |
| This should not affect any existing code. | |
| </p> | |
| <p><!-- CL 243911 --> | |
| The new <a href="/pkg/os/#DirFS"><code>DirFS</code></a> function | |
| provides an implementation of | |
| <a href="/pkg/io/fs/#FS"><code>fs.FS</code></a> backed by a tree | |
| of operating system files. | |
| </p> | |
| </dd> | |
| </dl><!-- os --> | |
| <dl id="os/signal"><dt><a href="/pkg/os/signal/">os/signal</a></dt> | |
| <dd> | |
| <p><!-- CL 219640 --> | |
| The new | |
| <a href="/pkg/os/signal/#NotifyContext"><code>NotifyContext</code></a> | |
| function allows creating contexts that are canceled upon arrival of | |
| specific signals. | |
| </p> | |
| </dd> | |
| </dl><!-- os/signal --> | |
| <dl id="path"><dt><a href="/pkg/path/">path</a></dt> | |
| <dd> | |
| <p><!-- CL 264397, golang.org/issues/28614 --> | |
| The <a href="/pkg/path/#Match"><code>Match</code></a> function now | |
| returns an error if the unmatched part of the pattern has a | |
| syntax error. Previously, the function returned early on a failed | |
| match, and thus did not report any later syntax error in the | |
| pattern. | |
| </p> | |
| </dd> | |
| </dl><!-- path --> | |
| <dl id="path/filepath"><dt><a href="/pkg/path/filepath/">path/filepath</a></dt> | |
| <dd> | |
| <p><!-- CL 267887 --> | |
| The new function | |
| <a href="/pkg/path/filepath/#WalkDir"><code>WalkDir</code></a> | |
| is similar to | |
| <a href="/pkg/path/filepath/#Walk"><code>Walk</code></a>, | |
| but is typically more efficient. | |
| The function passed to <code>WalkDir</code> receives a | |
| <a href="/pkg/io/fs/#DirEntry"><code>fs.DirEntry</code></a> | |
| instead of a | |
| <a href="/pkg/io/fs/#FileInfo"><code>fs.FileInfo</code></a>. | |
| (To clarify for those who recall the <code>Walk</code> function | |
| as taking an <a href="/pkg/os/#FileInfo"><code>os.FileInfo</code></a>, | |
| <code>os.FileInfo</code> is now an alias for <code>fs.FileInfo</code>.) | |
| </p> | |
| <p><!-- CL 264397, golang.org/issues/28614 --> | |
| The <a href="/pkg/path/filepath#Match"><code>Match</code></a> and | |
| <a href="/pkg/path/filepath#Glob"><code>Glob</code></a> functions now | |
| return an error if the unmatched part of the pattern has a | |
| syntax error. Previously, the functions returned early on a failed | |
| match, and thus did not report any later syntax error in the | |
| pattern. | |
| </p> | |
| </dd> | |
| </dl><!-- path/filepath --> | |
| <dl id="reflect"><dt><a href="/pkg/reflect/">reflect</a></dt> | |
| <dd> | |
| <p><!-- CL 192331 --> | |
| The Zero function has been optimized to avoid allocations. Code | |
| which incorrectly compares the returned Value to another Value | |
| using == or DeepEqual may get different results than those | |
| obtained in previous Go versions. The documentation | |
| for <a href="/pkg/reflect#Value"><code>reflect.Value</code></a> | |
| describes how to compare two <code>Value</code>s correctly. | |
| </p> | |
| </dd> | |
| </dl><!-- reflect --> | |
| <dl id="runtime/debug"><dt><a href="/pkg/runtime/debug/">runtime/debug</a></dt> | |
| <dd> | |
| <p><!-- CL 249677 --> | |
| The <a href="/pkg/runtime#Error"><code>runtime.Error</code></a> values | |
| used when <code>SetPanicOnFault</code> is enabled may now have an | |
| <code>Addr</code> method. If that method exists, it returns the memory | |
| address that triggered the fault. | |
| </p> | |
| </dd> | |
| </dl><!-- runtime/debug --> | |
| <dl id="strconv"><dt><a href="/pkg/strconv/">strconv</a></dt> | |
| <dd> | |
| <p><!-- CL 260858 --> | |
| <a href="/pkg/strconv/#ParseFloat"><code>ParseFloat</code></a> now uses | |
| the <a | |
| href="https://nigeltao.github.io/blog/2020/eisel-lemire.html">Eisel-Lemire | |
| algorithm</a>, improving performance by up to a factor of 2. This can | |
| also speed up decoding textual formats like <a | |
| href="/pkg/encoding/json/"><code>encoding/json</code></a>. | |
| </p> | |
| </dd> | |
| </dl><!-- strconv --> | |
| <dl id="syscall"><dt><a href="/pkg/syscall/">syscall</a></dt> | |
| <dd> | |
| <p><!-- CL 263271 --> | |
| <a href="/pkg/syscall/?GOOS=windows#NewCallback"><code>NewCallback</code></a> | |
| and | |
| <a href="/pkg/syscall/?GOOS=windows#NewCallbackCDecl"><code>NewCallbackCDecl</code></a> | |
| now correctly support callback functions with multiple | |
| sub-<code>uintptr</code>-sized arguments in a row. This may | |
| require changing uses of these functions to eliminate manual | |
| padding between small arguments. | |
| </p> | |
| <p><!-- CL 261917 --> | |
| <a href="/pkg/syscall/?GOOS=windows#SysProcAttr"><code>SysProcAttr</code></a> on Windows has a new <code>NoInheritHandles</code> field that disables inheriting handles when creating a new process. | |
| </p> | |
| <p><!-- CL 269761, golang.org/issue/42584 --> | |
| <a href="/pkg/syscall/?GOOS=windows#DLLError"><code>DLLError</code></a> on Windows now has an <code>Unwrap</code> method for unwrapping its underlying error. | |
| </p> | |
| <p><!-- CL 210639 --> | |
| On Linux, | |
| <a href="/pkg/syscall/#Setgid"><code>Setgid</code></a>, | |
| <a href="/pkg/syscall/#Setuid"><code>Setuid</code></a>, | |
| and related calls are now implemented. | |
| Previously, they returned an <code>syscall.EOPNOTSUPP</code> error. | |
| </p> | |
| <p><!-- CL 210639 --> | |
| On Linux, the new functions | |
| <a href="/pkg/syscall/#AllThreadsSyscall"><code>AllThreadsSyscall</code></a> | |
| and <a href="/pkg/syscall/#AllThreadsSyscall6"><code>AllThreadsSyscall6</code></a> | |
| may be used to make a system call on all Go threads in the process. | |
| These functions may only be used by programs that do not use cgo; | |
| if a program uses cgo, they will always return | |
| <a href="/pkg/syscall/#ENOTSUP"><code>syscall.ENOTSUP</code></a>. | |
| </p> | |
| </dd> | |
| </dl><!-- syscall --> | |
| <dl id="testing/iotest"><dt><a href="/pkg/testing/iotest/">testing/iotest</a></dt> | |
| <dd> | |
| <p><!-- CL 199501 --> | |
| The new | |
| <a href="/pkg/testing/iotest/#ErrReader"><code>ErrReader</code></a> | |
| function returns an | |
| <a href="/pkg/io/#Reader"><code>io.Reader</code></a> that always | |
| returns an error. | |
| </p> | |
| <p><!-- CL 243909 --> | |
| The new | |
| <a href="/pkg/testing/iotest/#TestReader"><code>TestReader</code></a> | |
| function tests that an <a href="/pkg/io/#Reader"><code>io.Reader</code></a> | |
| behaves correctly. | |
| </p> | |
| </dd> | |
| </dl><!-- testing/iotest --> | |
| <dl id="text/template"><dt><a href="/pkg/text/template/">text/template</a></dt> | |
| <dd> | |
| <p><!-- CL 254257, golang.org/issue/29770 --> | |
| Newlines characters are now allowed inside action delimiters, | |
| permitting actions to span multiple lines. | |
| </p> | |
| <p><!-- CL 243938 --> | |
| The new <a href="/pkg/text/template/#ParseFS"><code>template.ParseFS</code></a> | |
| function and <a href="/pkg/text/template/#Template.ParseFS"><code>template.Template.ParseFS</code></a> | |
| method are like <a href="/pkg/text/template/#ParseGlob"><code>template.ParseGlob</code></a> | |
| and <a href="/pkg/text/template/#Template.ParseGlob"><code>template.Template.ParseGlob</code></a>, | |
| but read the templates from an <a href="/pkg/io/fs/#FS"><code>fs.FS</code></a>. | |
| </p> | |
| </dd> | |
| </dl><!-- text/template --> | |
| <dl id="text/template/parse"><dt><a href="/pkg/text/template/parse/">text/template/parse</a></dt> | |
| <dd> | |
| <p><!-- CL 229398, golang.org/issue/34652 --> | |
| A new <a href="/pkg/text/template/parse/#CommentNode"><code>CommentNode</code></a> | |
| was added to the parse tree. The <a href="/pkg/text/template/parse/#Mode"><code>Mode</code></a> | |
| field in the <code>parse.Tree</code> enables access to it. | |
| </p> | |
| </dd> | |
| </dl><!-- text/template/parse --> | |
| <dl id="time/tzdata"><dt><a href="/pkg/time/tzdata/">time/tzdata</a></dt> | |
| <dd> | |
| <p><!-- CL 261877 --> | |
| The slim timezone data format is now used for the timezone database in | |
| <code>$GOROOT/lib/time/zoneinfo.zip</code> and the embedded copy in this | |
| package. This reduces the size of the timezone database by about 350 KB. | |
| </p> | |
| </dd> | |
| </dl><!-- time/tzdata --> | |
| <dl id="unicode"><dt><a href="/pkg/unicode/">unicode</a></dt> | |
| <dd> | |
| <p><!-- CL 248765 --> | |
| The <a href="/pkg/unicode/"><code>unicode</code></a> package and associated | |
| support throughout the system has been upgraded from Unicode 12.0.0 to | |
| <a href="https://www.unicode.org/versions/Unicode13.0.0/">Unicode 13.0.0</a>, | |
| which adds 5,930 new characters, including four new scripts, and 55 new emoji. | |
| Unicode 13.0.0 also designates plane 3 (U+30000-U+3FFFF) as the tertiary | |
| ideographic plane. | |
| </p> | |
| </dd> | |
| </dl><!-- unicode --> |