2018-10-31 10:03:15 -06:00
<!-- {
"Title": "Go 1.12 Release Notes",
"Path": "/doc/go1.12",
"Template": true
}-->
<!--
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 >
ul li { margin: 0.5em 0; }
< / style >
< h2 id = "introduction" > DRAFT RELEASE NOTES - Introduction to Go 1.12< / h2 >
< p >
< strong >
Go 1.12 is not yet released. These are work-in-progress
release notes. Go 1.12 is expected to be released in February 2019.
< / strong >
< / p >
< p >
The latest Go release, version 1.12, arrives six months after < a href = "go1.11" > Go 1.11< / a > .
Most of its changes are in TODO.
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 specification.
< / p >
2018-11-18 06:52:22 -07:00
< h2 id = "ports" > Ports< / h2 >
< h3 id = "freebsd" > FreeBSD< / h3 >
< p >
Go 1.12 is the last release that is supported on FreeBSD 10.x, which has
already reached end-of-life. Go 1.13 will require FreeBSD 11.2+ or FreeBSD
12.0+.
< / p >
2018-11-28 08:17:40 -07:00
< h3 id = "darwin" > Darwin< / h3 >
< p >
2018-11-27 18:09:58 -07:00
Go 1.12 is the last release that will run on macOS 10.10 Yosemite.
Go 1.13 will require macOS 10.11 El Capitan or later.
< / p >
2018-12-05 14:33:56 -07:00
< h3 id = "windows" > Windows< / h3 >
< p >
TODO: status of ARM32 port?
< / p >
< h3 id = "aix" > AIX< / h3 >
< p >
TODO: status of AIX port?
< / p >
< h3 id = "hurd" > Hurd< / h3 >
< p > <!-- CL 146023 -->
< code > hurd< / code > is now a recognized value for < code > GOOS< / code > , reserved
for the GNU/Hurd system for use with < code > gccgo< / code > .
< / p >
2018-10-31 10:03:15 -06:00
< h2 id = "tools" > Tools< / h2 >
2018-12-03 15:58:38 -07:00
< h3 id = "vet" > < code > go tool vet< / code > no longer supported< / h3 >
< p >
The < code > go vet< / code > command has been rewritten to serve as the
base for a range of different source code analysis tools. See
the < a href = "https://godoc.org/golang.org/x/tools/go/analysis" > golang.org/x/tools/go/analysis< / a >
package for details. A side-effect is that < code > go tool vet< / code >
is no longer supported. External tools that use < code > go tool
vet< / code > must be changed to use < code > go
vet< / code > . Using < code > go vet< / code > instead of < code > go tool
vet< / code > should work with all supported versions of Go.
< / p >
2018-10-31 10:03:15 -06:00
< h3 id = "gocache" > Build cache requirement< / h3 >
< p >
The build cache is now required as a step toward eliminating
< code > $GOPATH/pkg< / code > . Setting the environment variable
< code > GOCACHE=off< / code > to disable the
< a href = "/cmd/go/#hdr-Build_and_test_caching" > build cache< / a >
has no effect in Go 1.12.
< / p >
2018-12-06 07:03:59 -07:00
< h3 id = "binary-only" > Binary-only packages< / h3 >
< p >
Go 1.12 is the last release that will support binary-only packages.
< / p >
2018-12-05 14:33:56 -07:00
< h3 id = "modules" > Modules< / h3 >
< p > <!-- CL 148517 -->
When < code > GO111MODULE< / code > is set to < code > on< / code > , the < code > go< / code >
command now supports module-aware operations outside of a module directory,
provided that those operations do not need to resolve import paths relative to
the current directory or explicitly edit the < code > go.mod< / code > file.
Commands such as < code > go< / code > < code > get< / code > ,
< code > go< / code > < code > list< / code > , and
< code > go< / code > < code > mod< / code > < code > download< / code > behave as if in a
module with initially-empty requirements.
In this mode, < code > go< / code > < code > env< / code > < code > GOMOD< / code > reports
the system's null device (< code > /dev/null< / code > or < code > NUL< / code > ).
< / p >
< p > <!-- CL 146382 -->
< code > go< / code > commands that download and extract modules are now safe to
invoke concurrently.
The module cache (< code > GOPATH/pkg/mod< / code > ) must reside in a filesystem that
supports file locking.
< / p >
< p > <!-- CL 147282, 147281 -->
The < code > go< / code > directive in a < code > go.mod< / code > file now indicates the
version of the language used by the files within that module, and
< code > go< / code > < code > mod< / code > < code > tidy< / code > sets it to the
current release (< code > go< / code > < code > 1.12< / code > ) if no existing
version is present.
If the < code > go< / code > directive for a module specifies a
version < em > newer< / em > than the toolchain in use, the < code > go< / code > command
will attempt to build the packages regardless, and will note the mismatch only if
that build fails.
< / p >
2018-12-07 08:14:42 -07:00
< p > <!-- CL 152739 -->
When an import cannot be resolved using the active modules,
the < code > go< / code > command will now try to use the modules mentioned in the
main module's < code > replace< / code > directives before consulting the module
cache and the usual network sources.
If a matching replacement is found but the < code > replace< / code > directive does
not specify a version, the < code > go< / code > command uses a pseudo-version
derived from the zero < code > time.Time< / code > (such
as < code > v0.0.0-00010101000000-000000000000< / code > ).
< / p >
2018-11-29 10:47:11 -07:00
< h3 id = "compiler" > Compiler toolchain< / h3 >
< p > <!-- CL 134155, 134156 -->
The compiler's live variable analysis has improved. This may mean that
finalizers will be executed sooner in this release than in previous
releases. If that is a problem, consider the appropriate addition of a
< a href = "/pkg/runtime/#KeepAlive" > < code > runtime.KeepAlive< / code > < / a > call.
< / p >
< p > <!-- CL 147361 -->
More functions are now eligible for inlining by default, including
functions that do nothing but call another function.
This extra inlining makes it additionally important to use
< a href = "/pkg/runtime/#CallersFrames" > < code > runtime.CallersFrames< / code > < / a >
instead of iterating over the result of
< a href = "/pkg/runtime/#Callers" > < code > runtime.Callers< / code > < / a > directly.
< pre >
// Old code which no longer works correctly (it will miss inlined call frames).
var pcs [10]uintptr
n := runtime.Callers(1, pcs[:])
for _, pc := range pcs[:n] {
f := runtime.FuncForPC(pc)
if f != nil {
fmt.Println(f.Name())
}
}
< / pre >
< pre >
// New code which will work correctly.
var pcs [10]uintptr
n := runtime.Callers(1, pcs[:])
frames := runtime.CallersFrames(pcs[:n])
for {
frame, more := frames.Next()
fmt.Println(frame.Function)
if !more {
break
}
}
< / pre >
< / p >
2018-12-05 14:33:56 -07:00
< p > <!-- CL 144340 -->
The compiler now accepts a < code > -lang< / code > flag to set the Go language
version to use. For example, < code > -lang=go1.8< / code > causes the compiler to
emit an error if the program uses type aliases, which were added in Go 1.9.
Language changes made before Go 1.12 are not consistently enforced.
< / p >
2018-10-31 10:03:15 -06:00
< h3 id = "godoc" > Godoc< / h3 >
< p >
In Go 1.12, < code > godoc< / code > no longer has a command-line interface and
is only a web server. Users should use < code > go< / code > < code > doc< / code >
for command-line help output instead.
< / p >
< h2 id = "library" > Core library< / h2 >
< p >
All of the changes to the standard library are minor.
< / 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 >
2018-11-28 09:35:39 -07:00
<!-- CL 147218: https://golang.org/cl/147218: cmd/asm: rename R18 to R18_PLATFORM on ARM64 -->
<!-- CL 116275: https://golang.org/cl/116275: cmd/compile: avoid string allocations when map key is struct or array literal -->
2018-10-31 10:03:15 -06:00
<!-- CL 142717: https://golang.org/cl/142717: cmd/compile: remove obsolete "safe" mode -->
2018-11-28 09:35:39 -07:00
<!-- CL 146058: https://golang.org/cl/146058: It is invalid to convert a nil unsafe.Pointer to uintptr and back, with arithmetic.: cmd/compile: assume unsafe pointer arithmetic generates non - nil results -->
2018-10-31 10:03:15 -06:00
<!-- CL 141977: https://golang.org/cl/141977: cmd/doc: add - all flag to print all documentation for package -->
2018-11-28 09:35:39 -07:00
<!-- CL 146898: https://golang.org/cl/146898: cmd/link, runtime: add initial cgo support for ppc64 -->
<!-- CL 60790: https://golang.org/cl/60790: The trace tool now supports plotting mutator utilization curves, including cross - references to the execution trace. These are useful for analyzing the impact of the garbage collector on application latency and throughput.: cmd/trace: add minimum mutator utilization (MMU) plot -->
2018-10-31 10:03:15 -06:00
<!-- CL 115677: https://golang.org/cl/115677: cmd/vet: check embedded field tags too -->
2018-11-28 09:35:39 -07:00
< dl id = "bufio" > < dt > < a href = "/pkg/bufio/" > bufio< / a > < / dt >
< dd >
< p > <!-- CL 149297 -->
TODO: < a href = "https://golang.org/cl/149297" > https://golang.org/cl/149297< / a > : make Reader.Peek invalidate Unreads
< / p >
< / dl > <!-- bufio -->
2018-10-31 10:03:15 -06:00
< dl id = "build" > < dt > < a href = "/pkg/build/" > build< / a > < / dt >
< dd >
< p > <!-- CL 61511 -->
TODO: < a href = "https://golang.org/cl/61511" > https://golang.org/cl/61511< / a > : support frame-pointer for arm64
< / p >
< / dl > <!-- build -->
2018-12-04 14:22:26 -07:00
< dl id = "bytes" > < dt > < a href = "/pkg/bytes/" > bytes< / a > < / dt >
2018-10-31 10:03:15 -06:00
< dd >
< p > <!-- CL 137855 -->
2018-12-04 14:22:26 -07:00
The new function < a href = "/pkg/bytes/#ReplaceAll" > < code > ReplaceAll< / code > < / a > returns a copy of
a byte slice with all non-overlapping instances of a value replaced by another.
2018-10-31 10:03:15 -06:00
< / p >
< p > <!-- CL 145098 -->
2018-12-04 14:22:26 -07:00
A pointer to a zero-value < a href = "/pkg/bytes/#Reader" > < code > Reader< / code > < / a > is now
functionally equivalent to < a href = "/pkg/bytes/#NewReader" > < code > NewReader< / code > < / a > < code > (nil)< / code > .
Prior to Go 1.12, the former could not be used as a substitute for the latter in all cases.
2018-10-31 10:03:15 -06:00
< / p >
2018-12-04 14:22:26 -07:00
< / dl > <!-- bytes -->
2018-10-31 10:03:15 -06:00
2018-11-28 09:35:39 -07:00
< dl id = "cmd,runtime" > < dt > < a href = "/pkg/cmd,runtime/" > cmd,runtime< / a > < / dt >
< dd >
< p > <!-- CL 138675 -->
TODO: < a href = "https://golang.org/cl/138675" > https://golang.org/cl/138675< / a > : enable race detector on arm64
< / p >
< / dl > <!-- cmd,runtime -->
< dl id = "crypto/rand" > < dt > < a href = "/pkg/crypto/rand/" > crypto/rand< / a > < / dt >
< dd >
< p > <!-- CL 120055 -->
TODO: < a href = "https://golang.org/cl/120055" > https://golang.org/cl/120055< / a > : use the new getrandom syscall on FreeBSD
< / p >
< p > <!-- CL 139419 -->
TODO: < a href = "https://golang.org/cl/139419" > https://golang.org/cl/139419< / a > : warn to stderr if blocked 60+ sec on first Reader.Read call
< / p >
< / dl > <!-- crypto/rand -->
< dl id = "crypto/rc4" > < dt > < a href = "/pkg/crypto/rc4/" > crypto/rc4< / a > < / dt >
< dd >
< p > <!-- CL 130397 -->
TODO: < a href = "https://golang.org/cl/130397" > https://golang.org/cl/130397< / a > : remove assembler implementations
< / p >
< / dl > <!-- crypto/rc4 -->
< dl id = "database/sql" > < dt > < a href = "/pkg/database/sql/" > database/sql< / a > < / dt >
< dd >
< p > <!-- CL 145738 -->
2018-12-04 14:22:26 -07:00
A query cursor can now be obtained by passing a
< a href = "/pkg/database/sql/#Rows" > < code > *Rows< / code > < / a >
value to the < a href = "/pkg/database/sql/#Row.Scan" > < code > Row.Scan< / code > < / a > method.
2018-11-28 09:35:39 -07:00
< / p >
< / dl > <!-- database/sql -->
2018-10-31 10:03:15 -06:00
< dl id = "expvar" > < dt > < a href = "/pkg/expvar/" > expvar< / a > < / dt >
< dd >
< p > <!-- CL 139537 -->
2018-12-04 14:22:26 -07:00
The new < a href = "/pkg/expvar/#Map.Delete" > < code > Delete< / code > < / a > method allows
for deletion of key/value pairs from a < a href = "/pkg/expvar/#Map" > < code > Map< / code > < / a > .
2018-10-31 10:03:15 -06:00
< / p >
< / dl > <!-- expvar -->
< dl id = "fmt" > < dt > < a href = "/pkg/fmt/" > fmt< / a > < / dt >
< dd >
2018-12-04 14:22:26 -07:00
< p > <!-- CL 142737 -->
Maps are now printed in key-sorted order to ease testing. The ordering rules are:
< ul >
< li > When applicable, nil compares low
< li > ints, floats, and strings order by <
< li > NaN compares less than non-NaN floats
< li > bool compares false before true
< li > Complex compares real, then imaginary
< li > Pointers compare by machine address
< li > Channel values compare by machine address
< li > Structs compare each field in turn
< li > Arrays compare each element in turn
< li > Interface values compare first by < code > reflect.Type< / code > describing the concrete type
and then by concrete value as described in the previous rules.
< / ul >
2018-11-28 09:35:39 -07:00
< / p >
2018-12-04 14:22:26 -07:00
< p > <!-- CL 129777 -->
When printing maps, non-reflexive key values like < code > NaN< / code > were previously
displayed as < code > < nil> < / code > . As of this release, the correct values are printed.
2018-10-31 10:03:15 -06:00
< / p >
< / dl > <!-- fmt -->
< dl id = "go/doc" > < dt > < a href = "/pkg/go/doc/" > go/doc< / a > < / dt >
< dd >
< p > <!-- CL 140958 -->
2018-12-04 14:23:39 -07:00
To address some outstanding issues in < a href = "/cmd/doc/" > < code > cmd/doc< / code > < / a > ,
this package has a new < a href = "/pkg/go/doc/#Mode" > < code > Mode< / code > < / a > bit,
< code > PreserveAST< / code > , which controls whether AST data is cleared.
2018-10-31 10:03:15 -06:00
< / p >
< / dl > <!-- go/doc -->
2018-11-28 09:35:39 -07:00
< dl id = "go/token" > < dt > < a href = "/pkg/go/token/" > go/token< / a > < / dt >
< dd >
< p > <!-- CL 134075 -->
2018-12-04 14:23:39 -07:00
The < a href = "/pkg/go/token#File" > < code > File< / code > < / a > type has a new
< a href = "/pkg/go/token#File.LineStart" > < code > LineStart< / code > < / a > field,
which returns the position of the start of a given line. This is especially useful
in programs that occassionally handle non-Go files, such as assembly, but wish to use
the < code > token.Pos< / code > mechanism to identify file positions.
2018-11-28 09:35:39 -07:00
< / p >
< / dl > <!-- go/token -->
2018-10-31 10:03:15 -06:00
< dl id = "image" > < dt > < a href = "/pkg/image/" > image< / a > < / dt >
< dd >
< p > <!-- CL 118755 -->
2018-12-05 11:22:44 -07:00
The < a href = "/pkg/image/#RegisterFormat" > < code > RegisterFormat< / code > < / a > function is now safe for concurrent use.
2018-10-31 10:03:15 -06:00
< / p >
< / dl > <!-- image -->
< dl id = "image/png" > < dt > < a href = "/pkg/image/png/" > image/png< / a > < / dt >
< dd >
< p > <!-- CL 134235 -->
2018-12-05 11:22:44 -07:00
Paletted images with fewer than 16 colors now encode to smaller outputs.
2018-10-31 10:03:15 -06:00
< / p >
< / dl > <!-- image/png -->
2018-11-28 09:35:39 -07:00
< dl id = "internal/cpu" > < dt > < a href = "/pkg/internal/cpu/" > internal/cpu< / a > < / dt >
< dd >
< p > <!-- CL 149578 -->
TODO: < a href = "https://golang.org/cl/149578" > https://golang.org/cl/149578< / a > : move GODEBUGCPU options into GODEBUG
< / p >
< / dl > <!-- internal/cpu -->
2018-10-31 10:03:15 -06:00
< dl id = "internal/poll" > < dt > < a href = "/pkg/internal/poll/" > internal/poll< / a > < / dt >
< dd >
< p > <!-- CL 130676 -->
TODO: < a href = "https://golang.org/cl/130676" > https://golang.org/cl/130676< / a > : use F_FULLFSYNC fcntl for FD.Fsync on OS X
< / p >
< / dl > <!-- internal/poll -->
< dl id = "io" > < dt > < a href = "/pkg/io/" > io< / a > < / dt >
< dd >
< p > <!-- CL 139457 -->
2018-12-05 11:22:44 -07:00
The new < a href = "/pkg/io#StringWriter" > < code > StringWriter< / code > < / a > interface wraps the
< a href = "/pkg/io/#WriteString" > < code > WriteString< / code > < / a > function.
2018-10-31 10:03:15 -06:00
< / p >
< / dl > <!-- io -->
2018-11-28 09:35:39 -07:00
< dl id = "lib/time" > < dt > < a href = "/pkg/lib/time/" > lib/time< / a > < / dt >
< dd >
< p > <!-- CL 151299 -->
2018-12-05 14:36:18 -07:00
The time zone database in < code > $GOROOT/lib/time/zoneinfo.zip< / code > has been updated to version 2018g. Note that this ZIP file is only used if a time zone database is not provided by the operating system.
2018-11-28 09:35:39 -07:00
< / p >
< / dl > <!-- lib/time -->
2018-10-31 10:03:15 -06:00
< dl id = "math/bits" > < dt > < a href = "/pkg/math/bits/" > math/bits< / a > < / dt >
< dd >
< p > <!-- CL 123157 -->
2018-12-06 12:13:28 -07:00
New extended precision operations < a href = "/pkg/math/bits/#Add" > < code > Add< / code > < / a > , < a href = "/pkg/math/bits/#Sub" > < code > Sub< / code > < / a > , < a href = "/pkg/math/bits/#Mul" > < code > Mul< / code > < / a > , and < a href = "/pkg/math/bits/#Div" > < code > Div< / code > < / a > are available in < code > int< / code > , < code > int32< / code > , and < code > int64< / code > versions.
2018-10-31 10:03:15 -06:00
< / p >
< / dl > <!-- math/bits -->
< dl id = "net" > < dt > < a href = "/pkg/net/" > net< / a > < / dt >
< dd >
2018-11-28 09:35:39 -07:00
< p > <!-- CL 146659 -->
2018-12-04 12:31:52 -07:00
The
< a href = "/pkg/net/#Dialer.DualStack" > < code > Dialer.DualStack< / code > < / a > setting is now ignored and deprecated;
RFC 6555 Fast Fallback ("Happy Eyeballs") is now enabled by default. To disable, set
< a href = "/pkg/net/#Dialer.FallbackDelay" > < code > Dialer.FallbackDelay< / code > < / a > to a negative value.
2018-11-28 09:35:39 -07:00
< / p >
2018-12-04 08:49:27 -07:00
< p > <!-- CL 107196 -->
2018-12-04 12:31:52 -07:00
Similarly, TCP keep-alives are now enabled by default if
< a href = "/pkg/net/#Dialer.KeepAlive" > < code > Dialer.KeepAlive< / code > < / a > is zero.
To disable, set it to a negative value.
2018-12-04 08:49:27 -07:00
< / p >
2018-12-04 12:31:52 -07:00
< p > <!-- CL 113997 -->
On Linux, the < a href = "http://man7.org/linux/man-pages/man2/splice.2.html" > < code > splice< / code > system call< / a > is now used when copying from a
< a href = "/pkg/net/#UnixConn" > < code > UnixConn< / code > < / a > to a
< a href = "/pkg/net/#TCPConn" > < code > TCPConn< / code > < / a > .
< / p >
2018-10-31 10:03:15 -06:00
< / dl > <!-- net -->
< dl id = "net/http" > < dt > < a href = "/pkg/net/http/" > net/http< / a > < / dt >
< dd >
2018-12-04 12:31:52 -07:00
< p > <!-- CL 143177 -->
The HTTP server now rejects misdirected HTTP requests to HTTPS servers with a plaintext "400 Bad Request" response.
< / p >
2018-10-31 10:03:15 -06:00
< p > <!-- CL 130115 -->
2018-12-04 12:31:52 -07:00
The new < a href = "/pkg/net/http/#Client.CloseIdleConnections" > < code > Client.CloseIdleConnections< / code > < / a >
method calls the < code > Client< / code > 's underlying < code > Transport< / code > 's < code > CloseIdleConnections< / code >
if it has one.
2018-10-31 10:03:15 -06:00
< / p >
< p > <!-- CL 145398 -->
2018-12-04 12:31:52 -07:00
The < a href = "/pkg/net/http/#Transport" > < code > Transport< / code > < / a > no longer rejects HTTP responses which declare
HTTP Trailers but don't use chunked encoding. Instead, the declared trailers are now just ignored.
2018-10-31 10:03:15 -06:00
< / p >
2018-12-04 12:31:52 -07:00
< p > <!-- CL 152080 --> <!-- CL 151857 -->
The < a href = "/pkg/net/http/#Transport" > < code > Transport< / code > < / a > no longer handles < code > MAX_CONCURRENT_STREAMS< / code > values
advertised from HTTP/2 servers as strictly as it did during Go 1.10 and Go 1.11. The default behavior is now back
to how it was in Go 1.9: each connection to a server can have up to < code > MAX_CONCURRENT_STREAMS< / code > requests
active and then new TCP connections are created as needed. In Go 1.10 and Go 1.11 the < code > http2< / code > package
would block and wait for requests to finish instead of creating new connections.
To get the stricter behavior back, import the
< a href = "https://godoc.org/golang.org/x/net/http2" > < code > golang.org/x/net/http2< / code > < / a > package
directly and set
< a href = "https://godoc.org/golang.org/x/net/http2#Transport.StrictMaxConcurrentStreams" > < code > Transport.StrictMaxConcurrentStreams< / code > < / a > to
< code > true< / code > .
2018-12-04 08:49:27 -07:00
< / p >
2018-10-31 10:03:15 -06:00
< / dl > <!-- net/http -->
2018-11-28 09:35:39 -07:00
< dl id = "net/http/httputil" > < dt > < a href = "/pkg/net/http/httputil/" > net/http/httputil< / a > < / dt >
< dd >
< p > <!-- CL 146437 -->
2018-12-04 12:31:52 -07:00
The < a href = "/pkg/net/http/httputil/#ReverseProxy" > < code > ReverseProxy< / code > < / a > now automatically
proxies WebSocket requests.
2018-11-28 09:35:39 -07:00
< / p >
< / dl > <!-- net/http/httputil -->
2018-10-31 10:03:15 -06:00
< dl id = "os" > < dt > < a href = "/pkg/os/" > os< / a > < / dt >
< dd >
< p > <!-- CL 125443 -->
2018-12-04 12:31:52 -07:00
The new < a href = "/pkg/os/#ProcessState.ExitCode" > < code > ProcessState.ExitCode< / code > < / a > method
returns the process's exit code.
2018-10-31 10:03:15 -06:00
< / p >
< p > <!-- CL 135075 -->
2018-12-05 11:22:44 -07:00
< code > ModeCharDevice< / code > has been added to the < code > ModeType< / code > bitmask, allowing for
< code > ModeDevice | ModeCharDevice< / code > to be recovered when masking a
< a href = "/pkg/os/#FileMode" > < code > FileMode< / code > < / a > with < code > ModeType< / code > .
2018-10-31 10:03:15 -06:00
< / p >
< p > <!-- CL 139418 -->
2018-12-05 11:22:44 -07:00
The new function < a href = "/pkg/os/#UserHomeDir" > < code > UserHomeDir< / code > < / a > returns the
current user's home directory.
2018-10-31 10:03:15 -06:00
< / p >
2018-11-28 09:35:39 -07:00
< p > <!-- CL 146020 -->
2018-12-05 11:22:44 -07:00
< a href = "/pkg/os/#RemoveAll" > < code > RemoveAll< / code > < / a > now supports paths longer than 4096 characters
on most Unix systems.
2018-11-28 09:35:39 -07:00
< / p >
2018-10-31 10:03:15 -06:00
< / dl > <!-- os -->
2018-11-28 09:35:39 -07:00
< dl id = "path/filepath" > < dt > < a href = "/pkg/path/filepath/" > path/filepath< / a > < / dt >
< dd >
< p > <!-- CL 145220 -->
2018-12-05 11:22:44 -07:00
The < a href = "/pkg/path/filepath/#IsAbs" > < code > IsAbs< / code > < / a > function now returns true when passed
a reserved filename on Windows such as < code > NUL< / code > .
< a href = "https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file#naming-conventions" > List of reserved names.< / a >
2018-11-28 09:35:39 -07:00
< / p >
< / dl > <!-- path/filepath -->
2018-10-31 10:03:15 -06:00
< dl id = "reflect" > < dt > < a href = "/pkg/reflect/" > reflect< / a > < / dt >
< dd >
< p > <!-- CL 33572 -->
2018-12-04 14:23:39 -07:00
A new < a href = "/pkg/reflect#MapIter" > < code > MapIter< / code > < / a > type is
an iterator for ranging over a map. This type is exposed through the
< a href = "/pkg/reflect#Value" > < code > Value< / code > < / a > type's new
< a href = "/pkg/reflect#Value.MapRange" > < code > MapRange< / code > < / a > method.
This follows the same iteration semantics as a range statment, with < code > Next< / code >
to advance the iterator, and < code > Key< / code > /< code > Value< / code > to access each entry.
2018-10-31 10:03:15 -06:00
< / p >
< / dl > <!-- reflect -->
2018-11-28 09:35:39 -07:00
< dl id = "regexp" > < dt > < a href = "/pkg/regexp/" > regexp< / a > < / dt >
< dd >
< p > <!-- CL 139783 -->
TODO: < a href = "https://golang.org/cl/139783" > https://golang.org/cl/139783< / a > : add DeepEqual test
< / p >
< p > <!-- CL 139784 -->
TODO: < a href = "https://golang.org/cl/139784" > https://golang.org/cl/139784< / a > : add partial Deprecation comment to Copy
< / p >
< / dl > <!-- regexp -->
2018-10-31 10:03:15 -06:00
< dl id = "runtime" > < dt > < a href = "/pkg/runtime/" > runtime< / a > < / dt >
< dd >
< p > <!-- CL 135395 -->
TODO: < a href = "https://golang.org/cl/135395" > https://golang.org/cl/135395< / a > : use MADV_FREE on Linux if available
< / p >
< / dl > <!-- runtime -->
2018-11-28 09:35:39 -07:00
< dl id = "runtime/debug" > < dt > < a href = "/pkg/runtime/debug/" > runtime/debug< / a > < / dt >
< dd >
< p > <!-- CL 144220 -->
TODO: < a href = "https://golang.org/cl/144220" > https://golang.org/cl/144220< / a > : add API to read module info in binary
< / p >
< / dl > <!-- runtime/debug -->
2018-10-31 10:03:15 -06:00
< dl id = "strings" > < dt > < a href = "/pkg/strings/" > strings< / a > < / dt >
< dd >
2018-12-04 14:22:26 -07:00
< p > <!-- CL 137855 -->
The new function < a href = "/pkg/strings/#ReplaceAll" > < code > ReplaceAll< / code > < / a > returns a copy of
a string with all non-overlapping instances of a value replaced by another.
< / p >
< p > <!-- CL 145098 -->
A pointer to a zero-value < a href = "/pkg/strings/#Reader" > < code > Reader< / code > < / a > is now
functionally equivalent to < a href = "/pkg/strings/#NewReader" > < code > NewReader< / code > < / a > < code > (nil)< / code > .
Prior to Go 1.12, the former could not be used as a substitute for the latter in all cases.
< / p >
2018-10-31 10:03:15 -06:00
< p > <!-- CL 122835 -->
2018-12-04 12:31:52 -07:00
The new < a href = "/pkg/strings/#Builder.Cap" > < code > Builder.Cap< / code > < / a > method returns the capacity of the builder's underlying byte slice.
2018-10-31 10:03:15 -06:00
< / p >
2018-11-28 09:35:39 -07:00
< p > <!-- CL 131495 -->
2018-12-05 11:22:44 -07:00
The character mapping functions < a href = "/pkg/strings/#Map" > < code > Map< / code > < / a > ,
< a href = "/pkg/strings/#Title" > < code > Title< / code > < / a > ,
< a href = "/pkg/strings/#ToLower" > < code > ToLower< / code > < / a > ,
< a href = "/pkg/strings/#ToLowerSpecial" > < code > ToLowerSpecial< / code > < / a > ,
< a href = "/pkg/strings/#ToTitle" > < code > ToTitle< / code > < / a > ,
< a href = "/pkg/strings/#ToTitleSpecial" > < code > ToTitleSpecial< / code > < / a > ,
< a href = "/pkg/strings/#ToUpper" > < code > ToUpper< / code > < / a > , and
< a href = "/pkg/strings/#ToUpperSpecial" > < code > ToUpperSpecial< / code > < / a >
now always guarantee to return valid UTF-8. In earlier releases, if the input was invalid UTF-8 but no character replacements
needed to be applied, these routines incorrectly returned the invalid UTF-8 unmodified.
2018-11-28 09:35:39 -07:00
< / p >
2018-10-31 10:03:15 -06:00
< / dl > <!-- strings -->
< dl id = "syscall" > < dt > < a href = "/pkg/syscall/" > syscall< / a > < / dt >
< dd >
< p > <!-- CL 125456 -->
TODO: < a href = "https://golang.org/cl/125456" > https://golang.org/cl/125456< / a > : implement Unix Socket for Windows
< / p >
< p > <!-- CL 138595 -->
TODO: < a href = "https://golang.org/cl/138595" > https://golang.org/cl/138595< / a > : FreeBSD 12 ino64 support
< / p >
2018-11-28 09:35:39 -07:00
< p > <!-- CL 141639 -->
TODO: < a href = "https://golang.org/cl/141639" > https://golang.org/cl/141639< / a > : implement syscalls on Darwin using libSystem
< / p >
< p > <!-- CL 147117 -->
TODO: < a href = "https://golang.org/cl/147117" > https://golang.org/cl/147117< / a > : add Syscall18 on Windows
< / p >
2018-10-31 10:03:15 -06:00
< / dl > <!-- syscall -->
< dl id = "syscall/js" > < dt > < a href = "/pkg/syscall/js/" > syscall/js< / a > < / dt >
< dd >
< p > <!-- CL 141644 -->
TODO: < a href = "https://golang.org/cl/141644" > https://golang.org/cl/141644< / a > : add Wrapper interface to support external Value wrapper types
< / p >
< p > <!-- CL 143137 -->
TODO: < a href = "https://golang.org/cl/143137" > https://golang.org/cl/143137< / a > : make zero js.Value represent " undefined"
< / p >
< p > <!-- CL 144384 -->
TODO: < a href = "https://golang.org/cl/144384" > https://golang.org/cl/144384< / a > : add the Value.Truthy method
< / p >
< / dl > <!-- syscall/js -->
< dl id = "testing" > < dt > < a href = "/pkg/testing/" > testing< / a > < / dt >
< dd >
< p > <!-- CL 139258 -->
2018-12-06 09:02:49 -07:00
The < a href = "/cmd/go/#hdr-Testing_flags" > < code > -benchtime< / code > < / a > flag now supports setting an explicit iteration count instead of a time when the value ends with an "< code > x< / code > ". For example, < code > -benchtime=100x< / code > runs the benchmark 100 times.
2018-10-31 10:03:15 -06:00
< / p >
< / dl > <!-- testing -->
2018-11-28 09:35:39 -07:00
< dl id = "text/template" > < dt > < a href = "/pkg/text/template/" > text/template< / a > < / dt >
< dd >
< p > <!-- CL 142217 -->
2018-12-05 11:22:44 -07:00
When executing a template, long context values are no longer truncated in errors.
< / p >
< p >
< code > executing "tmpl" at < .very.deep.context.v... > : map has no entry for key "notpresent"< / code >
< / p >
< p >
is now
< / p >
< p >
< code > executing "tmpl" at < .very.deep.context.value.notpresent > : map has no entry for key "notpresent"< / code >
2018-11-28 09:35:39 -07:00
< / p >
< / dl > <!-- text/template -->