| <!--{ |
| "Title": "Go 1.15 Release Notes", |
| "Path": "/doc/go1.15" |
| }--> |
| |
| <!-- |
| 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.15</h2> |
| |
| <p> |
| The latest Go release, version 1.15, arrives six months after <a href="go1.14">Go 1.14</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> |
| |
| <p> |
| Go 1.15 includes <a href="#linker">substantial improvements to the linker</a>, |
| improves <a href="#runtime">allocation for small objects at high core counts</a>, and |
| deprecates <a href="#commonname">X.509 CommonName</a>. |
| <code>GOPROXY</code> now supports skipping proxies that return errors and |
| a new <a href="#time/tzdata">embedded tzdata package</a> has been added. |
| </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</h3> |
| |
| <p> |
| As <a href="go1.14#darwin">announced</a> in the Go 1.14 release |
| notes, Go 1.15 requires macOS 10.12 Sierra or later; support for |
| previous versions has been discontinued. |
| </p> |
| |
| <p> <!-- golang.org/issue/37610, golang.org/issue/37611, CL 227582, and CL 227198 --> |
| As <a href="/doc/go1.14#darwin">announced</a> in the Go 1.14 release |
| notes, Go 1.15 drops support for 32-bit binaries on macOS, iOS, |
| iPadOS, watchOS, and tvOS (the <code>darwin/386</code> |
| and <code>darwin/arm</code> ports). Go continues to support the |
| 64-bit <code>darwin/amd64</code> and <code>darwin/arm64</code> ports. |
| </p> |
| |
| <h3 id="windows">Windows</h3> |
| |
| <p> <!-- CL 214397 and CL 230217 --> |
| Go now generates Windows ASLR executables when <code>-buildmode=pie</code> |
| cmd/link flag is provided. Go command uses <code>-buildmode=pie</code> |
| by default on Windows. |
| </p> |
| |
| <p><!-- CL 227003 --> |
| The <code>-race</code> and <code>-msan</code> flags now always |
| enable <code>-d=checkptr</code>, which checks uses |
| of <code>unsafe.Pointer</code>. This was previously the case on all |
| OSes except Windows. |
| </p> |
| |
| <p><!-- CL 211139 --> |
| Go-built DLLs no longer cause the process to exit when it receives a |
| signal (such as Ctrl-C at a terminal). |
| </p> |
| |
| <h3 id="android">Android</h3> |
| |
| <p> <!-- CL 235017, golang.org/issue/38838 --> |
| When linking binaries for Android, Go 1.15 explicitly selects |
| the <code>lld</code> linker available in recent versions of the NDK. |
| The <code>lld</code> linker avoids crashes on some devices, and is |
| planned to become the default NDK linker in a future NDK version. |
| </p> |
| |
| <h3 id="openbsd">OpenBSD</h3> |
| |
| <p><!-- CL 234381 --> |
| Go 1.15 adds support for OpenBSD 6.7 on <code>GOARCH=arm</code> |
| and <code>GOARCH=arm64</code>. Previous versions of Go already |
| supported OpenBSD 6.7 on <code>GOARCH=386</code> |
| and <code>GOARCH=amd64</code>. |
| </p> |
| |
| <h3 id="riscv">RISC-V</h3> |
| |
| <p> <!-- CL 226400, CL 226206, and others --> |
| There has been progress in improving the stability and performance |
| of the 64-bit RISC-V port on Linux (<code>GOOS=linux</code>, |
| <code>GOARCH=riscv64</code>). It also now supports asynchronous |
| preemption. |
| </p> |
| |
| <h3 id="386">386</h3> |
| |
| <p><!-- golang.org/issue/40255 --> |
| Go 1.15 is the last release to support x87-only floating-point |
| hardware (<code>GO386=387</code>). Future releases will require at |
| least SSE2 support on 386, raising Go's |
| minimum <code>GOARCH=386</code> requirement to the Intel Pentium 4 |
| (released in 2000) or AMD Opteron/Athlon 64 (released in 2003). |
| </p> |
| |
| <h2 id="tools">Tools</h2> |
| |
| <h3 id="go-command">Go command</h3> |
| |
| <p><!-- golang.org/issue/37367 --> |
| The <code>GOPROXY</code> environment variable now supports skipping proxies |
| that return errors. Proxy URLs may now be separated with either commas |
| (<code>,</code>) or pipe characters (<code>|</code>). If a proxy URL is |
| followed by a comma, the <code>go</code> command will only try the next proxy |
| in the list after a 404 or 410 HTTP response. If a proxy URL is followed by a |
| pipe character, the <code>go</code> command will try the next proxy in the |
| list after any error. Note that the default value of <code>GOPROXY</code> |
| remains <code>https://proxy.golang.org,direct</code>, which does not fall |
| back to <code>direct</code> in case of errors. |
| </p> |
| |
| <h4 id="go-test"><code>go</code> <code>test</code></h4> |
| |
| <p><!-- https://golang.org/issue/36134 --> |
| Changing the <code>-timeout</code> flag now invalidates cached test results. A |
| cached result for a test run with a long timeout will no longer count as |
| passing when <code>go</code> <code>test</code> is re-invoked with a short one. |
| </p> |
| |
| <h4 id="go-flag-parsing">Flag parsing</h4> |
| |
| <p><!-- https://golang.org/cl/211358 --> |
| Various flag parsing issues in <code>go</code> <code>test</code> and |
| <code>go</code> <code>vet</code> have been fixed. Notably, flags specified |
| in <code>GOFLAGS</code> are handled more consistently, and |
| the <code>-outputdir</code> flag now interprets relative paths relative to the |
| working directory of the <code>go</code> command (rather than the working |
| directory of each individual test). |
| </p> |
| |
| <h4 id="module-cache">Module cache</h4> |
| |
| <p><!-- https://golang.org/cl/219538 --> |
| The location of the module cache may now be set with |
| the <code>GOMODCACHE</code> environment variable. The default value of |
| <code>GOMODCACHE</code> is <code>GOPATH[0]/pkg/mod</code>, the location of the |
| module cache before this change. |
| </p> |
| |
| <p><!-- https://golang.org/cl/221157 --> |
| A workaround is now available for Windows "Access is denied" errors in |
| <code>go</code> commands that access the module cache, caused by external |
| programs concurrently scanning the file system (see |
| <a href="https://golang.org/issue/36568">issue #36568</a>). The workaround is |
| not enabled by default because it is not safe to use when Go versions lower |
| than 1.14.2 and 1.13.10 are running concurrently with the same module cache. |
| It can be enabled by explicitly setting the environment variable |
| <code>GODEBUG=modcacheunzipinplace=1</code>. |
| </p> |
| |
| <h3 id="vet">Vet</h3> |
| |
| <h4 id="vet-string-int">New warning for string(x)</h4> |
| |
| <p><!-- CL 212919, 232660 --> |
| The vet tool now warns about conversions of the |
| form <code>string(x)</code> where <code>x</code> has an integer type |
| other than <code>rune</code> or <code>byte</code>. |
| Experience with Go has shown that many conversions of this form |
| erroneously assume that <code>string(x)</code> evaluates to the |
| string representation of the integer <code>x</code>. |
| It actually evaluates to a string containing the UTF-8 encoding of |
| the value of <code>x</code>. |
| For example, <code>string(9786)</code> does not evaluate to the |
| string <code>"9786"</code>; it evaluates to the |
| string <code>"\xe2\x98\xba"</code>, or <code>"☺"</code>. |
| </p> |
| |
| <p> |
| Code that is using <code>string(x)</code> correctly can be rewritten |
| to <code>string(rune(x))</code>. |
| Or, in some cases, calling <code>utf8.EncodeRune(buf, x)</code> with |
| a suitable byte slice <code>buf</code> may be the right solution. |
| Other code should most likely use <code>strconv.Itoa</code> |
| or <code>fmt.Sprint</code>. |
| </p> |
| |
| <p> |
| This new vet check is enabled by default when |
| using <code>go</code> <code>test</code>. |
| </p> |
| |
| <p> |
| We are considering prohibiting the conversion in a future release of Go. |
| That is, the language would change to only |
| permit <code>string(x)</code> for integer <code>x</code> when the |
| type of <code>x</code> is <code>rune</code> or <code>byte</code>. |
| Such a language change would not be backward compatible. |
| We are using this vet check as a first trial step toward changing |
| the language. |
| </p> |
| |
| <h4 id="vet-impossible-interface">New warning for impossible interface conversions</h4> |
| |
| <p><!-- CL 218779, 232660 --> |
| The vet tool now warns about type assertions from one interface type |
| to another interface type when the type assertion will always fail. |
| This will happen if both interface types implement a method with the |
| same name but with a different type signature. |
| </p> |
| |
| <p> |
| There is no reason to write a type assertion that always fails, so |
| any code that triggers this vet check should be rewritten. |
| </p> |
| |
| <p> |
| This new vet check is enabled by default when |
| using <code>go</code> <code>test</code>. |
| </p> |
| |
| <p> |
| We are considering prohibiting impossible interface type assertions |
| in a future release of Go. |
| Such a language change would not be backward compatible. |
| We are using this vet check as a first trial step toward changing |
| the language. |
| </p> |
| |
| <h2 id="runtime">Runtime</h2> |
| |
| <p><!-- CL 221779 --> |
| If <code>panic</code> is invoked with a value whose type is derived from any |
| of: <code>bool</code>, <code>complex64</code>, <code>complex128</code>, <code>float32</code>, <code>float64</code>, |
| <code>int</code>, <code>int8</code>, <code>int16</code>, <code>int32</code>, <code>int64</code>, <code>string</code>, |
| <code>uint</code>, <code>uint8</code>, <code>uint16</code>, <code>uint32</code>, <code>uint64</code>, <code>uintptr</code>, |
| then the value will be printed, instead of just its address. |
| Previously, this was only true for values of exactly these types. |
| </p> |
| |
| <p><!-- CL 228900 --> |
| On a Unix system, if the <code>kill</code> command |
| or <code>kill</code> system call is used to send |
| a <code>SIGSEGV</code>, <code>SIGBUS</code>, |
| or <code>SIGFPE</code> signal to a Go program, and if the signal |
| is not being handled via |
| <a href="/pkg/os/signal/#Notify"><code>os/signal.Notify</code></a>, |
| the Go program will now reliably crash with a stack trace. |
| In earlier releases the behavior was unpredictable. |
| </p> |
| |
| <p><!-- CL 221182, CL 229998 --> |
| Allocation of small objects now performs much better at high core |
| counts, and has lower worst-case latency. |
| </p> |
| |
| <p><!-- CL 216401 --> |
| Converting a small integer value into an interface value no longer |
| causes allocation. |
| </p> |
| |
| <p><!-- CL 216818 --> |
| Non-blocking receives on closed channels now perform as well as |
| non-blocking receives on open channels. |
| </p> |
| |
| <h2 id="compiler">Compiler</h2> |
| |
| <p><!-- CL 229578 --> |
| Package <code>unsafe</code>'s <a href="/pkg/unsafe/#Pointer">safety |
| rules</a> allow converting an <code>unsafe.Pointer</code> |
| into <code>uintptr</code> when calling certain |
| functions. Previously, in some cases, the compiler allowed multiple |
| chained conversions (for example, <code>syscall.Syscall(…,</code> |
| <code>uintptr(uintptr(ptr)),</code> <code>…)</code>). The compiler |
| now requires exactly one conversion. Code that used multiple |
| conversions should be updated to satisfy the safety rules. |
| </p> |
| |
| <p><!-- CL 230544, CL 231397 --> |
| Go 1.15 reduces typical binary sizes by around 5% compared to Go |
| 1.14 by eliminating certain types of GC metadata and more |
| aggressively eliminating unused type metadata. |
| </p> |
| |
| <p><!-- CL 219357, CL 231600 --> |
| The toolchain now mitigates |
| <a href="https://www.intel.com/content/www/us/en/support/articles/000055650/processors.html">Intel |
| CPU erratum SKX102</a> on <code>GOARCH=amd64</code> by aligning |
| functions to 32 byte boundaries and padding jump instructions. While |
| this padding increases binary sizes, this is more than made up for |
| by the binary size improvements mentioned above. |
| </p> |
| |
| <p><!-- CL 222661 --> |
| Go 1.15 adds a <code>-spectre</code> flag to both the |
| compiler and the assembler, to allow enabling Spectre mitigations. |
| These should almost never be needed and are provided mainly as a |
| “defense in depth” mechanism. |
| See the <a href="https://github.com/golang/go/wiki/Spectre">Spectre wiki page</a> for details. |
| </p> |
| |
| <p><!-- CL 228578 --> |
| The compiler now rejects <code>//go:</code> compiler directives that |
| have no meaning for the declaration they are applied to with a |
| "misplaced compiler directive" error. Such misapplied directives |
| were broken before, but were silently ignored by the compiler. |
| </p> |
| |
| <p><!-- CL 206658, CL 205066 --> |
| The compiler's <code>-json</code> optimization logging now reports |
| large (>= 128 byte) copies and includes explanations of escape |
| analysis decisions. |
| </p> |
| |
| <h2 id="linker">Linker</h2> |
| |
| <p> |
| This release includes substantial improvements to the Go linker, |
| which reduce linker resource usage (both time and memory) and |
| improve code robustness/maintainability. |
| </p> |
| |
| <p> |
| For a representative set of large Go programs, linking is 20% faster |
| and requires 30% less memory on average, for <code>ELF</code>-based |
| OSes (Linux, FreeBSD, NetBSD, OpenBSD, Dragonfly, and Solaris) |
| running on <code>amd64</code> architectures, with more modest |
| improvements for other architecture/OS combinations. |
| </p> |
| |
| <p> |
| The key contributors to better linker performance are a newly |
| redesigned object file format, and a revamping of internal |
| phases to increase concurrency (for example, applying relocations to |
| symbols in parallel). Object files in Go 1.15 are slightly larger |
| than their 1.14 equivalents. |
| </p> |
| |
| <p> |
| These changes are part of a multi-release project |
| to <a href="https://golang.org/s/better-linker">modernize the Go |
| linker</a>, meaning that there will be additional linker |
| improvements expected in future releases. |
| </p> |
| |
| <p><!-- CL 207877 --> |
| The linker now defaults to internal linking mode |
| for <code>-buildmode=pie</code> on |
| <code>linux/amd64</code> and <code>linux/arm64</code>, so these |
| configurations no longer require a C linker. External linking |
| mode (which was the default in Go 1.14 for |
| <code>-buildmode=pie</code>) can still be requested with |
| <code>-ldflags=-linkmode=external</code> flag. |
| </p> |
| |
| <h2 id="objdump">Objdump</h2> |
| |
| <p><!-- CL 225459 --> |
| The <a href="/cmd/objdump/">objdump</a> tool now supports |
| disassembling in GNU assembler syntax with the <code>-gnu</code> |
| flag. |
| </p> |
| |
| <h2 id="library">Core library</h2> |
| |
| <h3 id="time/tzdata">New embedded tzdata package</h3> |
| |
| <p> <!-- CL 224588 --> |
| Go 1.15 includes a new package, |
| <a href="/pkg/time/tzdata/"><code>time/tzdata</code></a>, |
| that permits embedding the timezone database into a program. |
| Importing this package (as <code>import _ "time/tzdata"</code>) |
| permits the program to find timezone information even if the |
| timezone database is not available on the local system. |
| You can also embed the timezone database by building |
| with <code>-tags timetzdata</code>. |
| Either approach increases the size of the program by about 800 KB. |
| </p> |
| |
| <h3 id="cgo">Cgo</h3> |
| |
| <p><!-- CL 235817 --> |
| Go 1.15 will translate the C type <code>EGLConfig</code> to the |
| Go type <code>uintptr</code>. This change is similar to how Go |
| 1.12 and newer treats <code>EGLDisplay</code>, Darwin's CoreFoundation and |
| Java's JNI types. See the <a href="/cmd/cgo/#hdr-Special_cases">cgo |
| documentation</a> for more information. |
| </p> |
| |
| <p><!-- CL 250940 --> |
| In Go 1.15.3 and later, cgo will not permit Go code to allocate an |
| undefined struct type (a C struct defined as just <code>struct |
| S;</code> or similar) on the stack or heap. |
| Go code will only be permitted to use pointers to those types. |
| Allocating an instance of such a struct and passing a pointer, or a |
| full struct value, to C code was always unsafe and unlikely to work |
| correctly; it is now forbidden. |
| The fix is to either rewrite the Go code to use only pointers, or to |
| ensure that the Go code sees the full definition of the struct by |
| including the appropriate C header file. |
| </p> |
| |
| <h3 id="commonname">X.509 CommonName deprecation</h3> |
| |
| <p><!-- CL 231379 --> |
| The deprecated, legacy behavior of treating the <code>CommonName</code> |
| field on X.509 certificates as a host name when no Subject Alternative Names |
| are present is now disabled by default. It can be temporarily re-enabled by |
| adding the value <code>x509ignoreCN=0</code> to the <code>GODEBUG</code> |
| environment variable. |
| </p> |
| |
| <p> |
| Note that if the <code>CommonName</code> is an invalid host name, it's always |
| ignored, regardless of <code>GODEBUG</code> settings. Invalid names include |
| those with any characters other than letters, digits, hyphens and underscores, |
| and those with empty labels or trailing dots. |
| </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="bufio"><dt><a href="/pkg/bufio/">bufio</a></dt> |
| <dd> |
| <p><!-- CL 225357, CL 225557 --> |
| When a <a href="/pkg/bufio/#Scanner"><code>Scanner</code></a> is |
| used with an invalid |
| <a href="/pkg/io/#Reader"><code>io.Reader</code></a> that |
| incorrectly returns a negative number from <code>Read</code>, |
| the <code>Scanner</code> will no longer panic, but will instead |
| return the new error |
| <a href="/pkg/bufio/#ErrBadReadCount"><code>ErrBadReadCount</code></a>. |
| </p> |
| </dd> |
| </dl><!-- bufio --> |
| |
| <dl id="context"><dt><a href="/pkg/context/">context</a></dt> |
| <dd> |
| <p><!-- CL 223777 --> |
| Creating a derived <code>Context</code> using a nil parent is now explicitly |
| disallowed. Any attempt to do so with the |
| <a href="/pkg/context/#WithValue"><code>WithValue</code></a>, |
| <a href="/pkg/context/#WithDeadline"><code>WithDeadline</code></a>, or |
| <a href="/pkg/context/#WithCancel"><code>WithCancel</code></a> functions |
| will cause a panic. |
| </p> |
| </dd> |
| </dl><!-- context --> |
| |
| <dl id="crypto"><dt><a href="/pkg/crypto/">crypto</a></dt> |
| <dd> |
| <p><!-- CL 231417, CL 225460 --> |
| The <code>PrivateKey</code> and <code>PublicKey</code> types in the |
| <a href="/pkg/crypto/rsa/"><code>crypto/rsa</code></a>, |
| <a href="/pkg/crypto/ecdsa/"><code>crypto/ecdsa</code></a>, and |
| <a href="/pkg/crypto/ed25519/"><code>crypto/ed25519</code></a> packages |
| now have an <code>Equal</code> method to compare keys for equivalence |
| or to make type-safe interfaces for public keys. The method signature |
| is compatible with |
| <a href="https://pkg.go.dev/github.com/google/go-cmp/cmp#Equal"><code>go-cmp</code>'s |
| definition of equality</a>. |
| </p> |
| |
| <p><!-- CL 224937 --> |
| <a href="/pkg/crypto/#Hash"><code>Hash</code></a> now implements |
| <a href="/pkg/fmt/#Stringer"><code>fmt.Stringer</code></a>. |
| </p> |
| </dd> |
| </dl><!-- crypto --> |
| |
| <dl id="crypto/ecdsa"><dt><a href="/pkg/crypto/ecdsa/">crypto/ecdsa</a></dt> |
| <dd> |
| <p><!-- CL 217940 --> |
| The new <a href="/pkg/crypto/ecdsa/#SignASN1"><code>SignASN1</code></a> |
| and <a href="/pkg/crypto/ecdsa/#VerifyASN1"><code>VerifyASN1</code></a> |
| functions allow generating and verifying ECDSA signatures in the standard |
| ASN.1 DER encoding. |
| </p> |
| </dd> |
| </dl><!-- crypto/ecdsa --> |
| |
| <dl id="crypto/elliptic"><dt><a href="/pkg/crypto/elliptic/">crypto/elliptic</a></dt> |
| <dd> |
| <p><!-- CL 202819 --> |
| The new <a href="/pkg/crypto/elliptic/#MarshalCompressed"><code>MarshalCompressed</code></a> |
| and <a href="/pkg/crypto/elliptic/#UnmarshalCompressed"><code>UnmarshalCompressed</code></a> |
| functions allow encoding and decoding NIST elliptic curve points in compressed format. |
| </p> |
| </dd> |
| </dl><!-- crypto/elliptic --> |
| |
| <dl id="crypto/rsa"><dt><a href="/pkg/crypto/rsa/">crypto/rsa</a></dt> |
| <dd> |
| <p><!-- CL 226203 --> |
| <a href="/pkg/crypto/rsa/#VerifyPKCS1v15"><code>VerifyPKCS1v15</code></a> |
| now rejects invalid short signatures with missing leading zeroes, according to RFC 8017. |
| </p> |
| </dd> |
| </dl><!-- crypto/rsa --> |
| |
| <dl id="crypto/tls"><dt><a href="/pkg/crypto/tls/">crypto/tls</a></dt> |
| <dd> |
| <p><!-- CL 214977 --> |
| The new |
| <a href="/pkg/crypto/tls/#Dialer"><code>Dialer</code></a> |
| type and its |
| <a href="/pkg/crypto/tls/#Dialer.DialContext"><code>DialContext</code></a> |
| method permit using a context to both connect and handshake with a TLS server. |
| </p> |
| |
| <p><!-- CL 229122 --> |
| The new |
| <a href="/pkg/crypto/tls/#Config.VerifyConnection"><code>VerifyConnection</code></a> |
| callback on the <a href="/pkg/crypto/tls/#Config"><code>Config</code></a> type |
| allows custom verification logic for every connection. It has access to the |
| <a href="/pkg/crypto/tls/#ConnectionState"><code>ConnectionState</code></a> |
| which includes peer certificates, SCTs, and stapled OCSP responses. |
| </p> |
| |
| <p><!-- CL 230679 --> |
| Auto-generated session ticket keys are now automatically rotated every 24 hours, |
| with a lifetime of 7 days, to limit their impact on forward secrecy. |
| </p> |
| |
| <p><!-- CL 231317 --> |
| Session ticket lifetimes in TLS 1.2 and earlier, where the session keys |
| are reused for resumed connections, are now limited to 7 days, also to |
| limit their impact on forward secrecy. |
| </p> |
| |
| <p><!-- CL 231038 --> |
| The client-side downgrade protection checks specified in RFC 8446 are now |
| enforced. This has the potential to cause connection errors for clients |
| encountering middleboxes that behave like unauthorized downgrade attacks. |
| </p> |
| |
| <p><!-- CL 208226 --> |
| <a href="/pkg/crypto/tls/#SignatureScheme"><code>SignatureScheme</code></a>, |
| <a href="/pkg/crypto/tls/#CurveID"><code>CurveID</code></a>, and |
| <a href="/pkg/crypto/tls/#ClientAuthType"><code>ClientAuthType</code></a> |
| now implement <a href="/pkg/fmt/#Stringer"><code>fmt.Stringer</code></a>. |
| </p> |
| |
| <p><!-- CL 236737 --> |
| The <a href="/pkg/crypto/tls/#ConnectionState"><code>ConnectionState</code></a> |
| fields <code>OCSPResponse</code> and <code>SignedCertificateTimestamps</code> |
| are now repopulated on client-side resumed connections. |
| </p> |
| |
| <p><!-- CL 227840 --> |
| <a href="/pkg/crypto/tls/#Conn"><code>tls.Conn</code></a> |
| now returns an opaque error on permanently broken connections, wrapping |
| the temporary |
| <a href="/pkg/net/http/#Error"><code>net.Error</code></a>. To access the |
| original <code>net.Error</code>, use |
| <a href="/pkg/errors/#As"><code>errors.As</code></a> (or |
| <a href="/pkg/errors/#Unwrap"><code>errors.Unwrap</code></a>) instead of a |
| type assertion. |
| </p> |
| </dd> |
| </dl><!-- crypto/tls --> |
| |
| <dl id="crypto/x509"><dt><a href="/pkg/crypto/x509/">crypto/x509</a></dt> |
| <dd> |
| <p><!-- CL 231378, CL 231380, CL 231381 --> |
| If either the name on the certificate or the name being verified (with |
| <a href="/pkg/crypto/x509/#VerifyOptions.DNSName"><code>VerifyOptions.DNSName</code></a> |
| or <a href="/pkg/crypto/x509/#Certificate.VerifyHostname"><code>VerifyHostname</code></a>) |
| are invalid, they will now be compared case-insensitively without further |
| processing (without honoring wildcards or stripping trailing dots). |
| Invalid names include those with any characters other than letters, |
| digits, hyphens and underscores, those with empty labels, and names on |
| certificates with trailing dots. |
| </p> |
| |
| <p><!-- CL 217298 --> |
| The new <a href="/pkg/crypto/x509/#CreateRevocationList"><code>CreateRevocationList</code></a> |
| function and <a href="/pkg/crypto/x509/#RevocationList"><code>RevocationList</code></a> type |
| allow creating RFC 5280-compliant X.509 v2 Certificate Revocation Lists. |
| </p> |
| |
| <p><!-- CL 227098 --> |
| <a href="/pkg/crypto/x509/#CreateCertificate"><code>CreateCertificate</code></a> |
| now automatically generates the <code>SubjectKeyId</code> if the template |
| is a CA and doesn't explicitly specify one. |
| </p> |
| |
| <p><!-- CL 228777 --> |
| <a href="/pkg/crypto/x509/#CreateCertificate"><code>CreateCertificate</code></a> |
| now returns an error if the template specifies <code>MaxPathLen</code> but is not a CA. |
| </p> |
| |
| <p><!-- CL 205237 --> |
| On Unix systems other than macOS, the <code>SSL_CERT_DIR</code> |
| environment variable can now be a colon-separated list. |
| </p> |
| |
| <p><!-- CL 227037 --> |
| On macOS, binaries are now always linked against |
| <code>Security.framework</code> to extract the system trust roots, |
| regardless of whether cgo is available. The resulting behavior should be |
| more consistent with the OS verifier. |
| </p> |
| </dd> |
| </dl><!-- crypto/x509 --> |
| |
| <dl id="crypto/x509/pkix"><dt><a href="/pkg/crypto/x509/pkix/">crypto/x509/pkix</a></dt> |
| <dd> |
| <p><!-- CL 229864, CL 240543 --> |
| <a href="/pkg/crypto/x509/pkix/#Name.String"><code>Name.String</code></a> |
| now prints non-standard attributes from |
| <a href="/pkg/crypto/x509/pkix/#Name.Names"><code>Names</code></a> if |
| <a href="/pkg/crypto/x509/pkix/#Name.ExtraNames"><code>ExtraNames</code></a> is nil. |
| </p> |
| </dd> |
| </dl><!-- crypto/x509/pkix --> |
| |
| <dl id="database/sql"><dt><a href="/pkg/database/sql/">database/sql</a></dt> |
| <dd> |
| <p><!-- CL 145758 --> |
| The new <a href="/pkg/database/sql/#DB.SetConnMaxIdleTime"><code>DB.SetConnMaxIdleTime</code></a> |
| method allows removing a connection from the connection pool after |
| it has been idle for a period of time, without regard to the total |
| lifespan of the connection. The <a href="/pkg/database/sql/#DBStats.MaxIdleTimeClosed"><code>DBStats.MaxIdleTimeClosed</code></a> |
| field shows the total number of connections closed due to |
| <code>DB.SetConnMaxIdleTime</code>. |
| </p> |
| |
| <p><!-- CL 214317 --> |
| The new <a href="/pkg/database/sql/#Row.Err"><code>Row.Err</code></a> getter |
| allows checking for query errors without calling |
| <code>Row.Scan</code>. |
| </p> |
| </dd> |
| </dl><!-- database/sql --> |
| |
| <dl id="database/sql/driver"><dt><a href="/pkg/database/sql/driver/">database/sql/driver</a></dt> |
| <dd> |
| <p><!-- CL 174122 --> |
| The new <a href="/pkg/database/sql/driver/#Validator"><code>Validator</code></a> |
| interface may be implemented by <code>Conn</code> to allow drivers |
| to signal if a connection is valid or if it should be discarded. |
| </p> |
| </dd> |
| </dl><!-- database/sql/driver --> |
| |
| <dl id="debug/pe"><dt><a href="/pkg/debug/pe/">debug/pe</a></dt> |
| <dd> |
| <p><!-- CL 222637 --> |
| The package now defines the |
| <code>IMAGE_FILE</code>, <code>IMAGE_SUBSYSTEM</code>, |
| and <code>IMAGE_DLLCHARACTERISTICS</code> constants used by the |
| PE file format. |
| </p> |
| </dd> |
| </dl><!-- debug/pe --> |
| |
| <dl id="encoding/asn1"><dt><a href="/pkg/encoding/asn1/">encoding/asn1</a></dt> |
| <dd> |
| <p><!-- CL 226984 --> |
| <a href="/pkg/encoding/asn1/#Marshal"><code>Marshal</code></a> now sorts the components |
| of SET OF according to X.690 DER. |
| </p> |
| |
| <p><!-- CL 227320 --> |
| <a href="/pkg/encoding/asn1/#Unmarshal"><code>Unmarshal</code></a> now rejects tags and |
| Object Identifiers which are not minimally encoded according to X.690 DER. |
| </p> |
| </dd> |
| </dl><!-- encoding/asn1 --> |
| |
| <dl id="encoding/json"><dt><a href="/pkg/encoding/json/">encoding/json</a></dt> |
| <dd> |
| <p><!-- CL 199837 --> |
| The package now has an internal limit to the maximum depth of |
| nesting when decoding. This reduces the possibility that a |
| deeply nested input could use large quantities of stack memory, |
| or even cause a "goroutine stack exceeds limit" panic. |
| </p> |
| </dd> |
| </dl><!-- encoding/json --> |
| |
| <dl id="flag"><dt><a href="/pkg/flag/">flag</a></dt> |
| <dd> |
| <p><!-- CL 221427 --> |
| When the <code>flag</code> package sees <code>-h</code> or <code>-help</code>, |
| and those flags are not defined, it now prints a usage message. |
| If the <a href="/pkg/flag/#FlagSet"><code>FlagSet</code></a> was created with |
| <a href="/pkg/flag/#ExitOnError"><code>ExitOnError</code></a>, |
| <a href="/pkg/flag/#FlagSet.Parse"><code>FlagSet.Parse</code></a> would then |
| exit with a status of 2. In this release, the exit status for <code>-h</code> |
| or <code>-help</code> has been changed to 0. In particular, this applies to |
| the default handling of command line flags. |
| </p> |
| </dd> |
| </dl> |
| |
| <dl id="fmt"><dt><a href="/pkg/fmt/">fmt</a></dt> |
| <dd> |
| <p><!-- CL 215001 --> |
| The printing verbs <code>%#g</code> and <code>%#G</code> now preserve |
| trailing zeros for floating-point values. |
| </p> |
| </dd> |
| </dl><!-- fmt --> |
| |
| <dl id="go/format"><dt><a href="/pkg/go/format/">go/format</a></dt> |
| <dd> |
| <p><!-- golang.org/issue/37476, CL 231461, CL 240683 --> |
| The <a href="/pkg/go/format/#Source"><code>Source</code></a> and |
| <a href="/pkg/go/format/#Node"><code>Node</code></a> functions |
| now canonicalize number literal prefixes and exponents as part |
| of formatting Go source code. This matches the behavior of the |
| <a href="/pkg/cmd/gofmt/"><code>gofmt</code></a> command as it |
| was implemented <a href="/doc/go1.13#gofmt">since Go 1.13</a>. |
| </p> |
| </dd> |
| </dl><!-- go/format --> |
| |
| <dl id="html/template"><dt><a href="/pkg/html/template/">html/template</a></dt> |
| <dd> |
| <p><!-- CL 226097 --> |
| The package now uses Unicode escapes (<code>\uNNNN</code>) in all |
| JavaScript and JSON contexts. This fixes escaping errors in |
| <code>application/ld+json</code> and <code>application/json</code> |
| contexts. |
| </p> |
| </dd> |
| </dl><!-- html/template --> |
| |
| <dl id="io/ioutil"><dt><a href="/pkg/io/ioutil/">io/ioutil</a></dt> |
| <dd> |
| <p><!-- CL 212597 --> |
| <a href="/pkg/io/ioutil/#TempDir"><code>TempDir</code></a> and |
| <a href="/pkg/io/ioutil/#TempFile"><code>TempFile</code></a> |
| now reject patterns that contain path separators. |
| That is, calls such as <code>ioutil.TempFile("/tmp",</code> <code>"../base*")</code> will no longer succeed. |
| This prevents unintended directory traversal. |
| </p> |
| </dd> |
| </dl><!-- io/ioutil --> |
| |
| <dl id="math/big"><dt><a href="/pkg/math/big/">math/big</a></dt> |
| <dd> |
| <p><!-- CL 230397 --> |
| The new <a href="/pkg/math/big/#Int.FillBytes"><code>Int.FillBytes</code></a> |
| method allows serializing to fixed-size pre-allocated byte slices. |
| </p> |
| </dd> |
| </dl><!-- math/big --> |
| |
| <dl id="math/cmplx"><dt><a href="/pkg/math/cmplx/">math/cmplx</a></dt> |
| <dd> |
| <p><!-- CL 220689 --> |
| The functions in this package were updated to conform to the C99 standard |
| (Annex G IEC 60559-compatible complex arithmetic) with respect to handling |
| of special arguments such as infinity, NaN and signed zero. |
| </p> |
| </dd> |
| </dl><!-- math/cmplx--> |
| |
| <dl id="net"><dt><a href="/pkg/net/">net</a></dt> |
| <dd> |
| <p><!-- CL 228645 --> |
| If an I/O operation exceeds a deadline set by |
| the <a href="/pkg/net/#Conn"><code>Conn.SetDeadline</code></a>, |
| <code>Conn.SetReadDeadline</code>, |
| or <code>Conn.SetWriteDeadline</code> methods, it will now |
| return an error that is or wraps |
| <a href="/pkg/os/#ErrDeadlineExceeded"><code>os.ErrDeadlineExceeded</code></a>. |
| This may be used to reliably detect whether an error is due to |
| an exceeded deadline. |
| Earlier releases recommended calling the <code>Timeout</code> |
| method on the error, but I/O operations can return errors for |
| which <code>Timeout</code> returns <code>true</code> although a |
| deadline has not been exceeded. |
| </p> |
| |
| <p><!-- CL 228641 --> |
| The new <a href="/pkg/net/#Resolver.LookupIP"><code>Resolver.LookupIP</code></a> |
| method supports IP lookups that are both network-specific and accept a context. |
| </p> |
| </dd> |
| </dl> |
| |
| <dl id="net/http"><dt><a href="/pkg/net/http/">net/http</a></dt> |
| <dd> |
| <p><!-- CL 231418, CL 231419 --> |
| Parsing is now stricter as a hardening measure against request smuggling attacks: |
| non-ASCII white space is no longer trimmed like SP and HTAB, and support for the |
| "<code>identity</code>" <code>Transfer-Encoding</code> was dropped. |
| </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 230937 --> |
| <a href="/pkg/net/http/httputil/#ReverseProxy"><code>ReverseProxy</code></a> |
| now supports not modifying the <code>X-Forwarded-For</code> |
| header when the incoming <code>Request.Header</code> map entry |
| for that field is <code>nil</code>. |
| </p> |
| |
| <p><!-- CL 224897 --> |
| When a Switching Protocol (like WebSocket) request handled by |
| <a href="/pkg/net/http/httputil/#ReverseProxy"><code>ReverseProxy</code></a> |
| is canceled, the backend connection is now correctly closed. |
| </p> |
| </dd> |
| </dl> |
| |
| <dl id="net/http/pprof"><dt><a href="/pkg/net/http/pprof/">net/http/pprof</a></dt> |
| <dd> |
| <p><!-- CL 147598, CL 229537 --> |
| All profile endpoints now support a "<code>seconds</code>" parameter. When present, |
| the endpoint profiles for the specified number of seconds and reports the difference. |
| The meaning of the "<code>seconds</code>" parameter in the <code>cpu</code> profile and |
| the trace endpoints is unchanged. |
| </p> |
| </dd> |
| </dl> |
| |
| <dl id="net/url"><dt><a href="/pkg/net/url/">net/url</a></dt> |
| <dd> |
| <p><!-- CL 227645 --> |
| The new <a href="/pkg/net/url/#URL"><code>URL</code></a> field |
| <code>RawFragment</code> and method <a href="/pkg/net/url/#URL.EscapedFragment"><code>EscapedFragment</code></a> |
| provide detail about and control over the exact encoding of a particular fragment. |
| These are analogous to |
| <code>RawPath</code> and <a href="/pkg/net/url/#URL.EscapedPath"><code>EscapedPath</code></a>. |
| </p> |
| <p><!-- CL 207082 --> |
| The new <a href="/pkg/net/url/#URL"><code>URL</code></a> |
| method <a href="/pkg/net/url/#URL.Redacted"><code>Redacted</code></a> |
| returns the URL in string form with any password replaced with <code>xxxxx</code>. |
| </p> |
| </dd> |
| </dl> |
| |
| <dl id="os"><dt><a href="/pkg/os/">os</a></dt> |
| <dd> |
| <p><!-- CL --> |
| If an I/O operation exceeds a deadline set by |
| the <a href="/pkg/os/#File.SetDeadline"><code>File.SetDeadline</code></a>, |
| <a href="/pkg/os/#File.SetReadDeadline"><code>File.SetReadDeadline</code></a>, |
| or <a href="/pkg/os/#File.SetWriteDeadline"><code>File.SetWriteDeadline</code></a> |
| methods, it will now return an error that is or wraps |
| <a href="/pkg/os/#ErrDeadlineExceeded"><code>os.ErrDeadlineExceeded</code></a>. |
| This may be used to reliably detect whether an error is due to |
| an exceeded deadline. |
| Earlier releases recommended calling the <code>Timeout</code> |
| method on the error, but I/O operations can return errors for |
| which <code>Timeout</code> returns <code>true</code> although a |
| deadline has not been exceeded. |
| </p> |
| |
| <p><!-- CL 232862 --> |
| Packages <code>os</code> and <code>net</code> now automatically |
| retry system calls that fail with <code>EINTR</code>. Previously |
| this led to spurious failures, which became more common in Go |
| 1.14 with the addition of asynchronous preemption. Now this is |
| handled transparently. |
| </p> |
| |
| <p><!-- CL 229101 --> |
| The <a href="/pkg/os/#File"><code>os.File</code></a> type now |
| supports a <a href="/pkg/os/#File.ReadFrom"><code>ReadFrom</code></a> |
| method. This permits the use of the <code>copy_file_range</code> |
| system call on some systems when using |
| <a href="/pkg/io/#Copy"><code>io.Copy</code></a> to copy data |
| from one <code>os.File</code> to another. A consequence is that |
| <a href="/pkg/io/#CopyBuffer"><code>io.CopyBuffer</code></a> |
| will not always use the provided buffer when copying to a |
| <code>os.File</code>. If a program wants to force the use of |
| the provided buffer, it can be done by writing |
| <code>io.CopyBuffer(struct{ io.Writer }{dst}, src, buf)</code>. |
| </p> |
| </dd> |
| </dl> |
| |
| <dl id="plugin"><dt><a href="/pkg/plugin/">plugin</a></dt> |
| <dd> |
| <p><!-- CL 182959 --> |
| DWARF generation is now supported (and enabled by default) for <code>-buildmode=plugin</code> on macOS. |
| </p> |
| </dd> |
| <dd> |
| <p><!-- CL 191617 --> |
| Building with <code>-buildmode=plugin</code> is now supported on <code>freebsd/amd64</code>. |
| </p> |
| </dd> |
| </dl> |
| |
| <dl id="reflect"><dt><a href="/pkg/reflect/">reflect</a></dt> |
| <dd> |
| <p><!-- CL 228902 --> |
| Package <code>reflect</code> now disallows accessing methods of all |
| non-exported fields, whereas previously it allowed accessing |
| those of non-exported, embedded fields. Code that relies on the |
| previous behavior should be updated to instead access the |
| corresponding promoted method of the enclosing variable. |
| </p> |
| </dd> |
| </dl> |
| |
| <dl id="regexp"><dt><a href="/pkg/regexp/">regexp</a></dt> |
| <dd> |
| <p><!-- CL 187919 --> |
| The new <a href="/pkg/regexp/#Regexp.SubexpIndex"><code>Regexp.SubexpIndex</code></a> |
| method returns the index of the first subexpression with the given name |
| within the regular expression. |
| </p> |
| </dd> |
| </dl><!-- regexp --> |
| |
| <dl id="pkg-runtime"><dt><a href="/pkg/runtime/">runtime</a></dt> |
| <dd> |
| <p><!-- CL 216557 --> |
| Several functions, including |
| <a href="/pkg/runtime/#ReadMemStats"><code>ReadMemStats</code></a> |
| and |
| <a href="/pkg/runtime/#GoroutineProfile"><code>GoroutineProfile</code></a>, |
| no longer block if a garbage collection is in progress. |
| </p> |
| </dd> |
| </dl> |
| |
| <dl id="pkg-runtime-pprof"><dt><a href="/pkg/runtime/pprof/">runtime/pprof</a></dt> |
| <dd> |
| <p><!-- CL 189318 --> |
| The goroutine profile now includes the profile labels associated with each |
| goroutine at the time of profiling. This feature is not yet implemented for |
| the profile reported with <code>debug=2</code>. |
| </p> |
| </dd> |
| </dl> |
| |
| <dl id="strconv"><dt><a href="/pkg/strconv/">strconv</a></dt> |
| <dd> |
| <p><!-- CL 216617 --> |
| <a href="/pkg/strconv/#FormatComplex"><code>FormatComplex</code></a> and <a href="/pkg/strconv/#ParseComplex"><code>ParseComplex</code></a> are added for working with complex numbers. |
| </p> |
| <p> |
| <a href="/pkg/strconv/#FormatComplex"><code>FormatComplex</code></a> converts a complex number into a string of the form (a+bi), where a and b are the real and imaginary parts. |
| </p> |
| <p> |
| <a href="/pkg/strconv/#ParseComplex"><code>ParseComplex</code></a> converts a string into a complex number of a specified precision. <code>ParseComplex</code> accepts complex numbers in the format <code>N+Ni</code>. |
| </p> |
| </dd> |
| </dl><!-- strconv --> |
| |
| <dl id="sync"><dt><a href="/pkg/sync/">sync</a></dt> |
| <dd> |
| <p><!-- CL 205899, golang.org/issue/33762 --> |
| The new method |
| <a href="/pkg/sync/#Map.LoadAndDelete"><code>Map.LoadAndDelete</code></a> |
| atomically deletes a key and returns the previous value if present. |
| </p> |
| <p><!-- CL 205899 --> |
| The method |
| <a href="/pkg/sync/#Map.Delete"><code>Map.Delete</code></a> |
| is more efficient. |
| </p> |
| </dd> |
| </dl><!-- sync --> |
| |
| <dl id="syscall"><dt><a href="/pkg/syscall/">syscall</a></dt> |
| <dd> |
| <p><!-- CL 231638 --> |
| On Unix systems, functions that use |
| <a href="/pkg/syscall/#SysProcAttr"><code>SysProcAttr</code></a> |
| will now reject attempts to set both the <code>Setctty</code> |
| and <code>Foreground</code> fields, as they both use |
| the <code>Ctty</code> field but do so in incompatible ways. |
| We expect that few existing programs set both fields. |
| </p> |
| <p> |
| Setting the <code>Setctty</code> field now requires that the |
| <code>Ctty</code> field be set to a file descriptor number in the |
| child process, as determined by the <code>ProcAttr.Files</code> field. |
| Using a child descriptor always worked, but there were certain |
| cases where using a parent file descriptor also happened to work. |
| Some programs that set <code>Setctty</code> will need to change |
| the value of <code>Ctty</code> to use a child descriptor number. |
| </p> |
| |
| <p><!-- CL 220578 --> |
| It is <a href="/pkg/syscall/#Proc.Call">now possible</a> to call |
| system calls that return floating point values |
| on <code>windows/amd64</code>. |
| </p> |
| </dd> |
| </dl> |
| |
| <dl id="testing"><dt><a href="/pkg/testing/">testing</a></dt> |
| <dd> |
| <p><!-- golang.org/issue/28135 --> |
| The <code>testing.T</code> type now has a |
| <a href="/pkg/testing/#T.Deadline"><code>Deadline</code></a> method |
| that reports the time at which the test binary will have exceeded its |
| timeout. |
| </p> |
| |
| <p><!-- golang.org/issue/34129 --> |
| A <code>TestMain</code> function is no longer required to call |
| <code>os.Exit</code>. If a <code>TestMain</code> function returns, |
| the test binary will call <code>os.Exit</code> with the value returned |
| by <code>m.Run</code>. |
| </p> |
| |
| <p><!-- CL 226877, golang.org/issue/35998 --> |
| The new methods |
| <a href="/pkg/testing/#T.TempDir"><code>T.TempDir</code></a> and |
| <a href="/pkg/testing/#B.TempDir"><code>B.TempDir</code></a> |
| return temporary directories that are automatically cleaned up |
| at the end of the test. |
| </p> |
| |
| <p><!-- CL 229085 --> |
| <code>go</code> <code>test</code> <code>-v</code> now groups output by |
| test name, rather than printing the test name on each line. |
| </p> |
| </dd> |
| </dl><!-- testing --> |
| |
| <dl id="text/template"><dt><a href="/pkg/text/template/">text/template</a></dt> |
| <dd> |
| <p><!-- CL 226097 --> |
| <a href="/pkg/text/template/#JSEscape"><code>JSEscape</code></a> now |
| consistently uses Unicode escapes (<code>\u00XX</code>), which are |
| compatible with JSON. |
| </p> |
| </dd> |
| </dl><!-- text/template --> |
| |
| <dl id="time"><dt><a href="/pkg/time/">time</a></dt> |
| <dd> |
| <p><!-- CL 220424, CL 217362, golang.org/issue/33184 --> |
| The new method |
| <a href="/pkg/time/#Ticker.Reset"><code>Ticker.Reset</code></a> |
| supports changing the duration of a ticker. |
| </p> |
| |
| <p><!-- CL 227878 --> |
| When returning an error, <a href="/pkg/time/#ParseDuration"><code>ParseDuration</code></a> now quotes the original value. |
| </p> |
| </dd> |
| </dl><!-- time --> |