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