12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310 |
- <!--{
- "Title": "Go 1.5 Release Notes",
- "Path": "/doc/go1.5",
- "Template": true
- }-->
- <h2 id="introduction">Introduction to Go 1.5</h2>
- <p>
- The latest Go release, version 1.5,
- is a significant release, including major architectural changes to the implementation.
- Despite that, we expect almost all Go programs to continue to compile and run as before,
- because the release still maintains the Go 1 <a href="/doc/go1compat.html">promise
- of compatibility</a>.
- </p>
- <p>
- The biggest developments in the implementation are:
- </p>
- <ul>
- <li>
- The compiler and runtime are now written entirely in Go (with a little assembler).
- C is no longer involved in the implementation, and so the C compiler that was
- once necessary for building the distribution is gone.
- </li>
- <li>
- The garbage collector is now <a href="https://golang.org/s/go14gc">concurrent</a> and provides dramatically lower
- pause times by running, when possible, in parallel with other goroutines.
- </li>
- <li>
- By default, Go programs run with <code>GOMAXPROCS</code> set to the
- number of cores available; in prior releases it defaulted to 1.
- </li>
- <li>
- Support for <a href="https://golang.org/s/go14internal">internal packages</a>
- is now provided for all repositories, not just the Go core.
- </li>
- <li>
- The <code>go</code> command now provides <a href="https://golang.org/s/go15vendor">experimental
- support</a> for "vendoring" external dependencies.
- </li>
- <li>
- A new <code>go tool trace</code> command supports fine-grained
- tracing of program execution.
- </li>
- <li>
- A new <code>go doc</code> command (distinct from <code>godoc</code>)
- is customized for command-line use.
- </li>
- </ul>
- <p>
- These and a number of other changes to the implementation and tools
- are discussed below.
- </p>
- <p>
- The release also contains one small language change involving map literals.
- </p>
- <p>
- Finally, the timing of the <a href="https://golang.org/s/releasesched">release</a>
- strays from the usual six-month interval,
- both to provide more time to prepare this major release and to shift the schedule thereafter to
- time the release dates more conveniently.
- </p>
- <h2 id="language">Changes to the language</h2>
- <h3 id="map_literals">Map literals</h3>
- <p>
- Due to an oversight, the rule that allowed the element type to be elided from slice literals was not
- applied to map keys.
- This has been <a href="/cl/2591">corrected</a> in Go 1.5.
- An example will make this clear.
- As of Go 1.5, this map literal,
- </p>
- <pre>
- m := map[Point]string{
- Point{29.935523, 52.891566}: "Persepolis",
- Point{-25.352594, 131.034361}: "Uluru",
- Point{37.422455, -122.084306}: "Googleplex",
- }
- </pre>
- <p>
- may be written as follows, without the <code>Point</code> type listed explicitly:
- </p>
- <pre>
- m := map[Point]string{
- {29.935523, 52.891566}: "Persepolis",
- {-25.352594, 131.034361}: "Uluru",
- {37.422455, -122.084306}: "Googleplex",
- }
- </pre>
- <h2 id="implementation">The Implementation</h2>
- <h3 id="c">No more C</h3>
- <p>
- The compiler and runtime are now implemented in Go and assembler, without C.
- The only C source left in the tree is related to testing or to <code>cgo</code>.
- There was a C compiler in the tree in 1.4 and earlier.
- It was used to build the runtime; a custom compiler was necessary in part to
- guarantee the C code would work with the stack management of goroutines.
- Since the runtime is in Go now, there is no need for this C compiler and it is gone.
- Details of the process to eliminate C are discussed <a href="https://golang.org/s/go13compiler">elsewhere</a>.
- </p>
- <p>
- The conversion from C was done with the help of custom tools created for the job.
- Most important, the compiler was actually moved by automatic translation of
- the C code into Go.
- It is in effect the same program in a different language.
- It is not a new implementation
- of the compiler so we expect the process will not have introduced new compiler
- bugs.
- An overview of this process is available in the slides for
- <a href="https://talks.golang.org/2015/gogo.slide">this presentation</a>.
- </p>
- <h3 id="compiler_and_tools">Compiler and tools</h3>
- <p>
- Independent of but encouraged by the move to Go, the names of the tools have changed.
- The old names <code>6g</code>, <code>8g</code> and so on are gone; instead there
- is just one binary, accessible as <code>go</code> <code>tool</code> <code>compile</code>,
- that compiles Go source into binaries suitable for the architecture and operating system
- specified by <code>$GOARCH</code> and <code>$GOOS</code>.
- Similarly, there is now one linker (<code>go</code> <code>tool</code> <code>link</code>)
- and one assembler (<code>go</code> <code>tool</code> <code>asm</code>).
- The linker was translated automatically from the old C implementation,
- but the assembler is a new native Go implementation discussed
- in more detail below.
- </p>
- <p>
- Similar to the drop of the names <code>6g</code>, <code>8g</code>, and so on,
- the output of the compiler and assembler are now given a plain <code>.o</code> suffix
- rather than <code>.8</code>, <code>.6</code>, etc.
- </p>
- <h3 id="gc">Garbage collector</h3>
- <p>
- The garbage collector has been re-engineered for 1.5 as part of the development
- outlined in the <a href="https://golang.org/s/go14gc">design document</a>.
- Expected latencies are much lower than with the collector
- in prior releases, through a combination of advanced algorithms,
- better <a href="https://golang.org/s/go15gcpacing">scheduling</a> of the collector,
- and running more of the collection in parallel with the user program.
- The "stop the world" phase of the collector
- will almost always be under 10 milliseconds and usually much less.
- </p>
- <p>
- For systems that benefit from low latency, such as user-responsive web sites,
- the drop in expected latency with the new collector may be important.
- </p>
- <p>
- Details of the new collector were presented in a
- <a href="https://talks.golang.org/2015/go-gc.pdf">talk</a> at GopherCon 2015.
- </p>
- <h3 id="runtime">Runtime</h3>
- <p>
- In Go 1.5, the order in which goroutines are scheduled has been changed.
- The properties of the scheduler were never defined by the language,
- but programs that depend on the scheduling order may be broken
- by this change.
- We have seen a few (erroneous) programs affected by this change.
- If you have programs that implicitly depend on the scheduling
- order, you will need to update them.
- </p>
- <p>
- Another potentially breaking change is that the runtime now
- sets the default number of threads to run simultaneously,
- defined by <code>GOMAXPROCS</code>, to the number
- of cores available on the CPU.
- In prior releases the default was 1.
- Programs that do not expect to run with multiple cores may
- break inadvertently.
- They can be updated by removing the restriction or by setting
- <code>GOMAXPROCS</code> explicitly.
- For a more detailed discussion of this change, see
- the <a href="https://golang.org/s/go15gomaxprocs">design document</a>.
- </p>
- <h3 id="build">Build</h3>
- <p>
- Now that the Go compiler and runtime are implemented in Go, a Go compiler
- must be available to compile the distribution from source.
- Thus, to build the Go core, a working Go distribution must already be in place.
- (Go programmers who do not work on the core are unaffected by this change.)
- Any Go 1.4 or later distribution (including <code>gccgo</code>) will serve.
- For details, see the <a href="https://golang.org/s/go15bootstrap">design document</a>.
- </p>
- <h2 id="ports">Ports</h2>
- <p>
- Due mostly to the industry's move away from the 32-bit x86 architecture,
- the set of binary downloads provided is reduced in 1.5.
- A distribution for the OS X operating system is provided only for the
- <code>amd64</code> architecture, not <code>386</code>.
- Similarly, the ports for Snow Leopard (Apple OS X 10.6) still work but are no
- longer released as a download or maintained since Apple no longer maintains that version
- of the operating system.
- Also, the <code>dragonfly/386</code> port is no longer supported at all
- because DragonflyBSD itself no longer supports the 32-bit 386 architecture.
- </p>
- <p>
- There are however several new ports available to be built from source.
- These include <code>darwin/arm</code> and <code>darwin/arm64</code>.
- The new port <code>linux/arm64</code> is mostly in place, but <code>cgo</code>
- is only supported using external linking.
- </p>
- <p>
- Also available as experiments are <code>ppc64</code>
- and <code>ppc64le</code> (64-bit PowerPC, big- and little-endian).
- Both these ports support <code>cgo</code> but
- only with internal linking.
- </p>
- <p>
- On FreeBSD, Go 1.5 requires FreeBSD 8-STABLE+ because of its new use of the <code>SYSCALL</code> instruction.
- </p>
- <p>
- On NaCl, Go 1.5 requires SDK version pepper-41. Later pepper versions are not
- compatible due to the removal of the sRPC subsystem from the NaCl runtime.
- </p>
- <p>
- On Darwin, the use of the system X.509 certificate interface can be disabled
- with the <code>ios</code> build tag.
- </p>
- <p>
- The Solaris port now has full support for cgo and the packages
- <a href="/pkg/net/"><code>net</code></a> and
- <a href="/pkg/crypto/x509/"><code>crypto/x509</code></a>,
- as well as a number of other fixes and improvements.
- </p>
- <h2 id="tools">Tools</h2>
- <h3 id="translate">Translating</h3>
- <p>
- As part of the process to eliminate C from the tree, the compiler and
- linker were translated from C to Go.
- It was a genuine (machine assisted) translation, so the new programs are essentially
- the old programs translated rather than new ones with new bugs.
- We are confident the translation process has introduced few if any new bugs,
- and in fact uncovered a number of previously unknown bugs, now fixed.
- </p>
- <p>
- The assembler is a new program, however; it is described below.
- </p>
- <h3 id="rename">Renaming</h3>
- <p>
- The suites of programs that were the compilers (<code>6g</code>, <code>8g</code>, etc.),
- the assemblers (<code>6a</code>, <code>8a</code>, etc.),
- and the linkers (<code>6l</code>, <code>8l</code>, etc.)
- have each been consolidated into a single tool that is configured
- by the environment variables <code>GOOS</code> and <code>GOARCH</code>.
- The old names are gone; the new tools are available through the <code>go</code> <code>tool</code>
- mechanism as <code>go tool compile</code>,
- <code>go tool asm</code>,
- <code>and go tool link</code>.
- Also, the file suffixes <code>.6</code>, <code>.8</code>, etc. for the
- intermediate object files are also gone; now they are just plain <code>.o</code> files.
- </p>
- <p>
- For example, to build and link a program on amd64 for Darwin
- using the tools directly, rather than through <code>go build</code>,
- one would run:
- </p>
- <pre>
- $ export GOOS=darwin GOARCH=amd64
- $ go tool compile program.go
- $ go tool link program.o
- </pre>
- <h3 id="moving">Moving</h3>
- <p>
- Because the <a href="/pkg/go/types/"><code>go/types</code></a> package
- has now moved into the main repository (see below),
- the <a href="/cmd/vet"><code>vet</code></a> and
- <a href="/cmd/cover"><code>cover</code></a>
- tools have also been moved.
- They are no longer maintained in the external <code>golang.org/x/tools</code> repository,
- although (deprecated) source still resides there for compatibility with old releases.
- </p>
- <h3 id="compiler">Compiler</h3>
- <p>
- As described above, the compiler in Go 1.5 is a single Go program,
- translated from the old C source, that replaces <code>6g</code>, <code>8g</code>,
- and so on.
- Its target is configured by the environment variables <code>GOOS</code> and <code>GOARCH</code>.
- </p>
- <p>
- The 1.5 compiler is mostly equivalent to the old,
- but some internal details have changed.
- One significant change is that evaluation of constants now uses
- the <a href="/pkg/math/big/"><code>math/big</code></a> package
- rather than a custom (and less well tested) implementation of high precision
- arithmetic.
- We do not expect this to affect the results.
- </p>
- <p>
- For the amd64 architecture only, the compiler has a new option, <code>-dynlink</code>,
- that assists dynamic linking by supporting references to Go symbols
- defined in external shared libraries.
- </p>
- <h3 id="assembler">Assembler</h3>
- <p>
- Like the compiler and linker, the assembler in Go 1.5 is a single program
- that replaces the suite of assemblers (<code>6a</code>,
- <code>8a</code>, etc.) and the environment variables
- <code>GOARCH</code> and <code>GOOS</code>
- configure the architecture and operating system.
- Unlike the other programs, the assembler is a wholly new program
- written in Go.
- </p>
- <p>
- The new assembler is very nearly compatible with the previous
- ones, but there are a few changes that may affect some
- assembler source files.
- See the updated <a href="/doc/asm">assembler guide</a>
- for more specific information about these changes. In summary:
- </p>
- <p>
- First, the expression evaluation used for constants is a little
- different.
- It now uses unsigned 64-bit arithmetic and the precedence
- of operators (<code>+</code>, <code>-</code>, <code><<</code>, etc.)
- comes from Go, not C.
- We expect these changes to affect very few programs but
- manual verification may be required.
- </p>
- <p>
- Perhaps more important is that on machines where
- <code>SP</code> or <code>PC</code> is only an alias
- for a numbered register,
- such as <code>R13</code> for the stack pointer and
- <code>R15</code> for the hardware program counter
- on ARM,
- a reference to such a register that does not include a symbol
- is now illegal.
- For example, <code>SP</code> and <code>4(SP)</code> are
- illegal but <code>sym+4(SP)</code> is fine.
- On such machines, to refer to the hardware register use its
- true <code>R</code> name.
- </p>
- <p>
- One minor change is that some of the old assemblers
- permitted the notation
- </p>
- <pre>
- constant=value
- </pre>
- <p>
- to define a named constant.
- Since this is always possible to do with the traditional
- C-like <code>#define</code> notation, which is still
- supported (the assembler includes an implementation
- of a simplified C preprocessor), the feature was removed.
- </p>
- <h3 id="link">Linker</h3>
- <p>
- The linker in Go 1.5 is now one Go program,
- that replaces <code>6l</code>, <code>8l</code>, etc.
- Its operating system and instruction set are specified
- by the environment variables <code>GOOS</code> and <code>GOARCH</code>.
- </p>
- <p>
- There are several other changes.
- The most significant is the addition of a <code>-buildmode</code> option that
- expands the style of linking; it now supports
- situations such as building shared libraries and allowing other languages
- to call into Go libraries.
- Some of these were outlined in a <a href="https://golang.org/s/execmodes">design document</a>.
- For a list of the available build modes and their use, run
- </p>
- <pre>
- $ go help buildmode
- </pre>
- <p>
- Another minor change is that the linker no longer records build time stamps in
- the header of Windows executables.
- Also, although this may be fixed, Windows cgo executables are missing some
- DWARF information.
- </p>
- <p>
- Finally, the <code>-X</code> flag, which takes two arguments,
- as in
- </p>
- <pre>
- -X importpath.name value
- </pre>
- <p>
- now also accepts a more common Go flag style with a single argument
- that is itself a <code>name=value</code> pair:
- </p>
- <pre>
- -X importpath.name=value
- </pre>
- <p>
- Although the old syntax still works, it is recommended that uses of this
- flag in scripts and the like be updated to the new form.
- </p>
- <h3 id="go_command">Go command</h3>
- <p>
- The <a href="/cmd/go"><code>go</code></a> command's basic operation
- is unchanged, but there are a number of changes worth noting.
- </p>
- <p>
- The previous release introduced the idea of a directory internal to a package
- being unimportable through the <code>go</code> command.
- In 1.4, it was tested with the introduction of some internal elements
- in the core repository.
- As suggested in the <a href="https://golang.org/s/go14internal">design document</a>,
- that change is now being made available to all repositories.
- The rules are explained in the design document, but in summary any
- package in or under a directory named <code>internal</code> may
- be imported by packages rooted in the same subtree.
- Existing packages with directory elements named <code>internal</code> may be
- inadvertently broken by this change, which was why it was advertised
- in the last release.
- </p>
- <p>
- Another change in how packages are handled is the experimental
- addition of support for "vendoring".
- For details, see the documentation for the <a href="/cmd/go/#hdr-Vendor_Directories"><code>go</code> command</a>
- and the <a href="https://golang.org/s/go15vendor">design document</a>.
- </p>
- <p>
- There have also been several minor changes.
- Read the <a href="/cmd/go">documentation</a> for full details.
- </p>
- <ul>
- <li>
- SWIG support has been updated such that
- <code>.swig</code> and <code>.swigcxx</code>
- now require SWIG 3.0.6 or later.
- </li>
- <li>
- The <code>install</code> subcommand now removes the
- binary created by the <code>build</code> subcommand
- in the source directory, if present,
- to avoid problems having two binaries present in the tree.
- </li>
- <li>
- The <code>std</code> (standard library) wildcard package name
- now excludes commands.
- A new <code>cmd</code> wildcard covers the commands.
- </li>
- <li>
- A new <code>-asmflags</code> build option
- sets flags to pass to the assembler.
- However,
- the <code>-ccflags</code> build option has been dropped;
- it was specific to the old, now deleted C compiler .
- </li>
- <li>
- A new <code>-buildmode</code> build option
- sets the build mode, described above.
- </li>
- <li>
- A new <code>-pkgdir</code> build option
- sets the location of installed package archives,
- to help isolate custom builds.
- </li>
- <li>
- A new <code>-toolexec</code> build option
- allows substitution of a different command to invoke
- the compiler and so on.
- This acts as a custom replacement for <code>go tool</code>.
- </li>
- <li>
- The <code>test</code> subcommand now has a <code>-count</code>
- flag to specify how many times to run each test and benchmark.
- The <a href="/pkg/testing/"><code>testing</code></a> package
- does the work here, through the <code>-test.count</code> flag.
- </li>
- <li>
- The <code>generate</code> subcommand has a couple of new features.
- The <code>-run</code> option specifies a regular expression to select which directives
- to execute; this was proposed but never implemented in 1.4.
- The executing pattern now has access to two new environment variables:
- <code>$GOLINE</code> returns the source line number of the directive
- and <code>$DOLLAR</code> expands to a dollar sign.
- </li>
- <li>
- The <code>get</code> subcommand now has a <code>-insecure</code>
- flag that must be enabled if fetching from an insecure repository, one that
- does not encrypt the connection.
- </li>
- </ul>
- <h3 id="vet_command">Go vet command</h3>
- <p>
- The <a href="/cmd/vet"><code>go tool vet</code></a> command now does
- more thorough validation of struct tags.
- </p>
- <h3 id="trace_command">Trace command</h3>
- <p>
- A new tool is available for dynamic execution tracing of Go programs.
- The usage is analogous to how the test coverage tool works.
- Generation of traces is integrated into <code>go test</code>,
- and then a separate execution of the tracing tool itself analyzes the results:
- </p>
- <pre>
- $ go test -trace=trace.out path/to/package
- $ go tool trace [flags] pkg.test trace.out
- </pre>
- <p>
- The flags enable the output to be displayed in a browser window.
- For details, run <code>go tool trace -help</code>.
- There is also a description of the tracing facility in this
- <a href="https://talks.golang.org/2015/dynamic-tools.slide">talk</a>
- from GopherCon 2015.
- </p>
- <h3 id="doc_command">Go doc command</h3>
- <p>
- A few releases back, the <code>go doc</code>
- command was deleted as being unnecessary.
- One could always run "<code>godoc .</code>" instead.
- The 1.5 release introduces a new <a href="/cmd/doc"><code>go doc</code></a>
- command with a more convenient command-line interface than
- <code>godoc</code>'s.
- It is designed for command-line usage specifically, and provides a more
- compact and focused presentation of the documentation for a package
- or its elements, according to the invocation.
- It also provides case-insensitive matching and
- support for showing the documentation for unexported symbols.
- For details run "<code>go help doc</code>".
- </p>
- <h3 id="cgo">Cgo</h3>
- <p>
- When parsing <code>#cgo</code> lines,
- the invocation <code>${SRCDIR}</code> is now
- expanded into the path to the source directory.
- This allows options to be passed to the
- compiler and linker that involve file paths relative to the
- source code directory. Without the expansion the paths would be
- invalid when the current working directory changes.
- </p>
- <p>
- Solaris now has full cgo support.
- </p>
- <p>
- On Windows, cgo now uses external linking by default.
- </p>
- <p>
- When a C struct ends with a zero-sized field, but the struct itself is
- not zero-sized, Go code can no longer refer to the zero-sized field.
- Any such references will have to be rewritten.
- </p>
- <h2 id="performance">Performance</h2>
- <p>
- As always, the changes are so general and varied that precise statements
- about performance are difficult to make.
- The changes are even broader ranging than usual in this release, which
- includes a new garbage collector and a conversion of the runtime to Go.
- Some programs may run faster, some slower.
- On average the programs in the Go 1 benchmark suite run a few percent faster in Go 1.5
- than they did in Go 1.4,
- while as mentioned above the garbage collector's pauses are
- dramatically shorter, and almost always under 10 milliseconds.
- </p>
- <p>
- Builds in Go 1.5 will be slower by a factor of about two.
- The automatic translation of the compiler and linker from C to Go resulted in
- unidiomatic Go code that performs poorly compared to well-written Go.
- Analysis tools and refactoring helped to improve the code, but much remains to be done.
- Further profiling and optimization will continue in Go 1.6 and future releases.
- For more details, see these <a href="https://talks.golang.org/2015/gogo.slide">slides</a>
- and associated <a href="https://www.youtube.com/watch?v=cF1zJYkBW4A">video</a>.
- </p>
- <h2 id="library">Core library</h2>
- <h3 id="flag">Flag</h3>
- <p>
- The flag package's
- <a href="/pkg/flag/#PrintDefaults"><code>PrintDefaults</code></a>
- function, and method on <a href="/pkg/flag/#FlagSet"><code>FlagSet</code></a>,
- have been modified to create nicer usage messages.
- The format has been changed to be more human-friendly and in the usage
- messages a word quoted with `backquotes` is taken to be the name of the
- flag's operand to display in the usage message.
- For instance, a flag created with the invocation,
- </p>
- <pre>
- cpuFlag = flag.Int("cpu", 1, "run `N` processes in parallel")
- </pre>
- <p>
- will show the help message,
- </p>
- <pre>
- -cpu N
- run N processes in parallel (default 1)
- </pre>
- <p>
- Also, the default is now listed only when it is not the zero value for the type.
- </p>
- <h3 id="math_big">Floats in math/big</h3>
- <p>
- The <a href="/pkg/math/big/"><code>math/big</code></a> package
- has a new, fundamental data type,
- <a href="/pkg/math/big/#Float"><code>Float</code></a>,
- which implements arbitrary-precision floating-point numbers.
- A <code>Float</code> value is represented by a boolean sign,
- a variable-length mantissa, and a 32-bit fixed-size signed exponent.
- The precision of a <code>Float</code> (the mantissa size in bits)
- can be specified explicitly or is otherwise determined by the first
- operation that creates the value.
- Once created, the size of a <code>Float</code>'s mantissa may be modified with the
- <a href="/pkg/math/big/#Float.SetPrec"><code>SetPrec</code></a> method.
- <code>Floats</code> support the concept of infinities, such as are created by
- overflow, but values that would lead to the equivalent of IEEE 754 NaNs
- trigger a panic.
- <code>Float</code> operations support all IEEE-754 rounding modes.
- When the precision is set to 24 (53) bits,
- operations that stay within the range of normalized <code>float32</code>
- (<code>float64</code>)
- values produce the same results as the corresponding IEEE-754
- arithmetic on those values.
- </p>
- <h3 id="go_types">Go types</h3>
- <p>
- The <a href="/pkg/go/types/"><code>go/types</code></a> package
- up to now has been maintained in the <code>golang.org/x</code>
- repository; as of Go 1.5 it has been relocated to the main repository.
- The code at the old location is now deprecated.
- There is also a modest API change in the package, discussed below.
- </p>
- <p>
- Associated with this move, the
- <a href="/pkg/go/constant/"><code>go/constant</code></a>
- package also moved to the main repository;
- it was <code>golang.org/x/tools/exact</code> before.
- The <a href="/pkg/go/importer/"><code>go/importer</code></a> package
- also moved to the main repository,
- as well as some tools described above.
- </p>
- <h3 id="net">Net</h3>
- <p>
- The DNS resolver in the net package has almost always used <code>cgo</code> to access
- the system interface.
- A change in Go 1.5 means that on most Unix systems DNS resolution
- will no longer require <code>cgo</code>, which simplifies execution
- on those platforms.
- Now, if the system's networking configuration permits, the native Go resolver
- will suffice.
- The important effect of this change is that each DNS resolution occupies a goroutine
- rather than a thread,
- so a program with multiple outstanding DNS requests will consume fewer operating
- system resources.
- </p>
- <p>
- The decision of how to run the resolver applies at run time, not build time.
- The <code>netgo</code> build tag that has been used to enforce the use
- of the Go resolver is no longer necessary, although it still works.
- A new <code>netcgo</code> build tag forces the use of the <code>cgo</code> resolver at
- build time.
- To force <code>cgo</code> resolution at run time set
- <code>GODEBUG=netdns=cgo</code> in the environment.
- More debug options are documented <a href="https://golang.org/cl/11584">here</a>.
- </p>
- <p>
- This change applies to Unix systems only.
- Windows, Mac OS X, and Plan 9 systems behave as before.
- </p>
- <h3 id="reflect">Reflect</h3>
- <p>
- The <a href="/pkg/reflect/"><code>reflect</code></a> package
- has two new functions: <a href="/pkg/reflect/#ArrayOf"><code>ArrayOf</code></a>
- and <a href="/pkg/reflect/#FuncOf"><code>FuncOf</code></a>.
- These functions, analogous to the extant
- <a href="/pkg/reflect/#SliceOf"><code>SliceOf</code></a> function,
- create new types at runtime to describe arrays and functions.
- </p>
- <h3 id="hardening">Hardening</h3>
- <p>
- Several dozen bugs were found in the standard library
- through randomized testing with the
- <a href="https://github.com/dvyukov/go-fuzz"><code>go-fuzz</code></a> tool.
- Bugs were fixed in the
- <a href="/pkg/archive/tar/"><code>archive/tar</code></a>,
- <a href="/pkg/archive/zip/"><code>archive/zip</code></a>,
- <a href="/pkg/compress/flate/"><code>compress/flate</code></a>,
- <a href="/pkg/encoding/gob/"><code>encoding/gob</code></a>,
- <a href="/pkg/fmt/"><code>fmt</code></a>,
- <a href="/pkg/html/template/"><code>html/template</code></a>,
- <a href="/pkg/image/gif/"><code>image/gif</code></a>,
- <a href="/pkg/image/jpeg/"><code>image/jpeg</code></a>,
- <a href="/pkg/image/png/"><code>image/png</code></a>, and
- <a href="/pkg/text/template/"><code>text/template</code></a>,
- packages.
- The fixes harden the implementation against incorrect and malicious inputs.
- </p>
- <h3 id="minor_library_changes">Minor changes to the library</h3>
- <ul>
- <li>
- The <a href="/pkg/archive/zip/"><code>archive/zip</code></a> package's
- <a href="/pkg/archive/zip/#Writer"><code>Writer</code></a> type now has a
- <a href="/pkg/archive/zip/#Writer.SetOffset"><code>SetOffset</code></a>
- method to specify the location within the output stream at which to write the archive.
- </li>
- <li>
- The <a href="/pkg/bufio/#Reader"><code>Reader</code></a> in the
- <a href="/pkg/bufio/"><code>bufio</code></a> package now has a
- <a href="/pkg/bufio/#Reader.Discard"><code>Discard</code></a>
- method to discard data from the input.
- </li>
- <li>
- In the <a href="/pkg/bytes/"><code>bytes</code></a> package,
- the <a href="/pkg/bytes/#Buffer"><code>Buffer</code></a> type
- now has a <a href="/pkg/bytes/#Buffer.Cap"><code>Cap</code></a> method
- that reports the number of bytes allocated within the buffer.
- Similarly, in both the <a href="/pkg/bytes/"><code>bytes</code></a>
- and <a href="/pkg/strings/"><code>strings</code></a> packages,
- the <a href="/pkg/bytes/#Reader"><code>Reader</code></a>
- type now has a <a href="/pkg/bytes/#Reader.Size"><code>Size</code></a>
- method that reports the original length of the underlying slice or string.
- </li>
- <li>
- Both the <a href="/pkg/bytes/"><code>bytes</code></a> and
- <a href="/pkg/strings/"><code>strings</code></a> packages
- also now have a <a href="/pkg/bytes/#LastIndexByte"><code>LastIndexByte</code></a>
- function that locates the rightmost byte with that value in the argument.
- </li>
- <li>
- The <a href="/pkg/crypto/"><code>crypto</code></a> package
- has a new interface, <a href="/pkg/crypto/#Decrypter"><code>Decrypter</code></a>,
- that abstracts the behavior of a private key used in asymmetric decryption.
- </li>
- <li>
- In the <a href="/pkg/crypto/cipher/"><code>crypto/cipher</code></a> package,
- the documentation for the <a href="/pkg/crypto/cipher/#Stream"><code>Stream</code></a>
- interface has been clarified regarding the behavior when the source and destination are
- different lengths.
- If the destination is shorter than the source, the method will panic.
- This is not a change in the implementation, only the documentation.
- </li>
- <li>
- Also in the <a href="/pkg/crypto/cipher/"><code>crypto/cipher</code></a> package,
- there is now support for nonce lengths other than 96 bytes in AES's Galois/Counter mode (GCM),
- which some protocols require.
- </li>
- <li>
- In the <a href="/pkg/crypto/elliptic/"><code>crypto/elliptic</code></a> package,
- there is now a <code>Name</code> field in the
- <a href="/pkg/crypto/elliptic/#CurveParams"><code>CurveParams</code></a> struct,
- and the curves implemented in the package have been given names.
- These names provide a safer way to select a curve, as opposed to
- selecting its bit size, for cryptographic systems that are curve-dependent.
- </li>
- <li>
- Also in the <a href="/pkg/crypto/elliptic/"><code>crypto/elliptic</code></a> package,
- the <a href="/pkg/crypto/elliptic/#Unmarshal"><code>Unmarshal</code></a> function
- now verifies that the point is actually on the curve.
- (If it is not, the function returns nils).
- This change guards against certain attacks.
- </li>
- <li>
- The <a href="/pkg/crypto/sha512/"><code>crypto/sha512</code></a>
- package now has support for the two truncated versions of
- the SHA-512 hash algorithm, SHA-512/224 and SHA-512/256.
- </li>
- <li>
- The <a href="/pkg/crypto/tls/"><code>crypto/tls</code></a> package
- minimum protocol version now defaults to TLS 1.0.
- The old default, SSLv3, is still available through <a href="/pkg/crypto/tls/#Config"><code>Config</code></a> if needed.
- </li>
- <li>
- The <a href="/pkg/crypto/tls/"><code>crypto/tls</code></a> package
- now supports Signed Certificate Timestamps (SCTs) as specified in RFC 6962.
- The server serves them if they are listed in the
- <a href="/pkg/crypto/tls/#Certificate"><code>Certificate</code></a> struct,
- and the client requests them and exposes them, if present,
- in its <a href="/pkg/crypto/tls/#ConnectionState"><code>ConnectionState</code></a> struct.
- <li>
- The stapled OCSP response to a <a href="/pkg/crypto/tls/"><code>crypto/tls</code></a> client connection,
- previously only available via the
- <a href="/pkg/crypto/tls/#Conn.OCSPResponse"><code>OCSPResponse</code></a> method,
- is now exposed in the <a href="/pkg/crypto/tls/#ConnectionState"><code>ConnectionState</code></a> struct.
- </li>
- <li>
- The <a href="/pkg/crypto/tls/"><code>crypto/tls</code></a> server implementation
- will now always call the
- <code>GetCertificate</code> function in
- the <a href="/pkg/crypto/tls/#Config"><code>Config</code></a> struct
- to select a certificate for the connection when none is supplied.
- </li>
- <li>
- Finally, the session ticket keys in the
- <a href="/pkg/crypto/tls/"><code>crypto/tls</code></a> package
- can now be changed while the server is running.
- This is done through the new
- <a href="/pkg/crypto/tls/#Config.SetSessionTicketKeys"><code>SetSessionTicketKeys</code></a>
- method of the
- <a href="/pkg/crypto/tls/#Config"><code>Config</code></a> type.
- </li>
- <li>
- In the <a href="/pkg/crypto/x509/"><code>crypto/x509</code></a> package,
- wildcards are now accepted only in the leftmost label as defined in
- <a href="https://tools.ietf.org/html/rfc6125#section-6.4.3">the specification</a>.
- </li>
- <li>
- Also in the <a href="/pkg/crypto/x509/"><code>crypto/x509</code></a> package,
- the handling of unknown critical extensions has been changed.
- They used to cause parse errors but now they are parsed and caused errors only
- in <a href="/pkg/crypto/x509/#Certificate.Verify"><code>Verify</code></a>.
- The new field <code>UnhandledCriticalExtensions</code> of
- <a href="/pkg/crypto/x509/#Certificate"><code>Certificate</code></a> records these extensions.
- </li>
- <li>
- The <a href="/pkg/database/sql/#DB"><code>DB</code></a> type of the
- <a href="/pkg/database/sql/"><code>database/sql</code></a> package
- now has a <a href="/pkg/database/sql/#DB.Stats"><code>Stats</code></a> method
- to retrieve database statistics.
- </li>
- <li>
- The <a href="/pkg/debug/dwarf/"><code>debug/dwarf</code></a>
- package has extensive additions to better support DWARF version 4.
- See for example the definition of the new type
- <a href="/pkg/debug/dwarf/#Class"><code>Class</code></a>.
- </li>
- <li>
- The <a href="/pkg/debug/dwarf/"><code>debug/dwarf</code></a> package
- also now supports decoding of DWARF line tables.
- </li>
- <li>
- The <a href="/pkg/debug/elf/"><code>debug/elf</code></a>
- package now has support for the 64-bit PowerPC architecture.
- </li>
- <li>
- The <a href="/pkg/encoding/base64/"><code>encoding/base64</code></a> package
- now supports unpadded encodings through two new encoding variables,
- <a href="/pkg/encoding/base64/#RawStdEncoding"><code>RawStdEncoding</code></a> and
- <a href="/pkg/encoding/base64/#RawURLEncoding"><code>RawURLEncoding</code></a>.
- </li>
- <li>
- The <a href="/pkg/encoding/json/"><code>encoding/json</code></a> package
- now returns an <a href="/pkg/encoding/json/#UnmarshalTypeError"><code>UnmarshalTypeError</code></a>
- if a JSON value is not appropriate for the target variable or component
- to which it is being unmarshaled.
- </li>
- <li>
- The <code>encoding/json</code>'s
- <a href="/pkg/encoding/json/#Decoder"><code>Decoder</code></a>
- type has a new method that provides a streaming interface for decoding
- a JSON document:
- <a href="/pkg/encoding/json/#Decoder.Token"><code>Token</code></a>.
- It also interoperates with the existing functionality of <code>Decode</code>,
- which will continue a decode operation already started with <code>Decoder.Token</code>.
- </li>
- <li>
- The <a href="/pkg/flag/"><code>flag</code></a> package
- has a new function, <a href="/pkg/flag/#UnquoteUsage"><code>UnquoteUsage</code></a>,
- to assist in the creation of usage messages using the new convention
- described above.
- </li>
- <li>
- In the <a href="/pkg/fmt/"><code>fmt</code></a> package,
- a value of type <a href="/pkg/reflect/#Value"><code>Value</code></a> now
- prints what it holds, rather than use the <code>reflect.Value</code>'s <code>Stringer</code>
- method, which produces things like <code><int Value></code>.
- </li>
- <li>
- The <a href="/pkg/ast/#EmptyStmt"><code>EmptyStmt</code></a> type
- in the <a href="/pkg/go/ast/"><code>go/ast</code></a> package now
- has a boolean <code>Implicit</code> field that records whether the
- semicolon was implicitly added or was present in the source.
- </li>
- <li>
- For forward compatibility the <a href="/pkg/go/build/"><code>go/build</code></a> package
- reserves <code>GOARCH</code> values for a number of architectures that Go might support one day.
- This is not a promise that it will.
- Also, the <a href="/pkg/go/build/#Package"><code>Package</code></a> struct
- now has a <code>PkgTargetRoot</code> field that stores the
- architecture-dependent root directory in which to install, if known.
- </li>
- <li>
- The (newly migrated) <a href="/pkg/go/types/"><code>go/types</code></a>
- package allows one to control the prefix attached to package-level names using
- the new <a href="/pkg/go/types/#Qualifier"><code>Qualifier</code></a>
- function type as an argument to several functions. This is an API change for
- the package, but since it is new to the core, it is not breaking the Go 1 compatibility
- rules since code that uses the package must explicitly ask for it at its new location.
- To update, run
- <a href="https://golang.org/cmd/go/#hdr-Run_go_tool_fix_on_packages"><code>go fix</code></a> on your package.
- </li>
- <li>
- In the <a href="/pkg/image/"><code>image</code></a> package,
- the <a href="/pkg/image/#Rectangle"><code>Rectangle</code></a> type
- now implements the <a href="/pkg/image/#Image"><code>Image</code></a> interface,
- so a <code>Rectangle</code> can serve as a mask when drawing.
- </li>
- <li>
- Also in the <a href="/pkg/image/"><code>image</code></a> package,
- to assist in the handling of some JPEG images,
- there is now support for 4:1:1 and 4:1:0 YCbCr subsampling and basic
- CMYK support, represented by the new <code>image.CMYK</code> struct.
- </li>
- <li>
- The <a href="/pkg/image/color/"><code>image/color</code></a> package
- adds basic CMYK support, through the new
- <a href="/pkg/image/color/#CMYK"><code>CMYK</code></a> struct,
- the <a href="/pkg/image/color/#CMYKModel"><code>CMYKModel</code></a> color model, and the
- <a href="/pkg/image/color/#CMYKToRGB"><code>CMYKToRGB</code></a> function, as
- needed by some JPEG images.
- </li>
- <li>
- Also in the <a href="/pkg/image/color/"><code>image/color</code></a> package,
- the conversion of a <a href="/pkg/image/color/#YCbCr"><code>YCbCr</code></a>
- value to <code>RGBA</code> has become more precise.
- Previously, the low 8 bits were just an echo of the high 8 bits;
- now they contain more accurate information.
- Because of the echo property of the old code, the operation
- <code>uint8(r)</code> to extract an 8-bit red value worked, but is incorrect.
- In Go 1.5, that operation may yield a different value.
- The correct code is, and always was, to select the high 8 bits:
- <code>uint8(r>>8)</code>.
- Incidentally, the <code>image/draw</code> package
- provides better support for such conversions; see
- <a href="https://blog.golang.org/go-imagedraw-package">this blog post</a>
- for more information.
- </li>
- <li>
- Finally, as of Go 1.5 the closest match check in
- <a href="/pkg/image/color/#Palette.Index"><code>Index</code></a>
- now honors the alpha channel.
- </li>
- <li>
- The <a href="/pkg/image/gif/"><code>image/gif</code></a> package
- includes a couple of generalizations.
- A multiple-frame GIF file can now have an overall bounds different
- from all the contained single frames' bounds.
- Also, the <a href="/pkg/image/gif/#GIF"><code>GIF</code></a> struct
- now has a <code>Disposal</code> field
- that specifies the disposal method for each frame.
- </li>
- <li>
- The <a href="/pkg/io/"><code>io</code></a> package
- adds a <a href="/pkg/io/#CopyBuffer"><code>CopyBuffer</code></a> function
- that is like <a href="/pkg/io/#Copy"><code>Copy</code></a> but
- uses a caller-provided buffer, permitting control of allocation and buffer size.
- </li>
- <li>
- The <a href="/pkg/log/"><code>log</code></a> package
- has a new <a href="/pkg/log/#LUTC"><code>LUTC</code></a> flag
- that causes time stamps to be printed in the UTC time zone.
- It also adds a <a href="/pkg/log/#Logger.SetOutput"><code>SetOutput</code></a> method
- for user-created loggers.
- </li>
- <li>
- In Go 1.4, <a href="/pkg/math/#Max"><code>Max</code></a> was not detecting all possible NaN bit patterns.
- This is fixed in Go 1.5, so programs that use <code>math.Max</code> on data including NaNs may behave differently,
- but now correctly according to the IEEE754 definition of NaNs.
- </li>
- <li>
- The <a href="/pkg/math/big/"><code>math/big</code></a> package
- adds a new <a href="/pkg/math/big/#Jacobi"><code>Jacobi</code></a>
- function for integers and a new
- <a href="/pkg/math/big/#Int.ModSqrt"><code>ModSqrt</code></a>
- method for the <a href="/pkg/math/big/#Int"><code>Int</code></a> type.
- </li>
- <li>
- The mime package
- adds a new <a href="/pkg/mime/#WordDecoder"><code>WordDecoder</code></a> type
- to decode MIME headers containing RFC 204-encoded words.
- It also provides <a href="/pkg/mime/#BEncoding"><code>BEncoding</code></a> and
- <a href="/pkg/mime/#QEncoding"><code>QEncoding</code></a>
- as implementations of the encoding schemes of RFC 2045 and RFC 2047.
- </li>
- <li>
- The <a href="/pkg/mime/"><code>mime</code></a> package also adds an
- <a href="/pkg/mime/#ExtensionsByType"><code>ExtensionsByType</code></a>
- function that returns the MIME extensions know to be associated with a given MIME type.
- </li>
- <li>
- There is a new <a href="/pkg/mime/quotedprintable/"><code>mime/quotedprintable</code></a>
- package that implements the quoted-printable encoding defined by RFC 2045.
- </li>
- <li>
- The <a href="/pkg/net/"><code>net</code></a> package will now
- <a href="/pkg/net/#Dial"><code>Dial</code></a> hostnames by trying each
- IP address in order until one succeeds.
- The <code><a href="/pkg/net/#Dialer">Dialer</a>.DualStack</code>
- mode now implements Happy Eyeballs
- (<a href="https://tools.ietf.org/html/rfc6555">RFC 6555</a>) by giving the
- first address family a 300ms head start; this value can be overridden by
- the new <code>Dialer.FallbackDelay</code>.
- </li>
- <li>
- A number of inconsistencies in the types returned by errors in the
- <a href="/pkg/net/"><code>net</code></a> package have been
- tidied up.
- Most now return an
- <a href="/pkg/net/#OpError"><code>OpError</code></a> value
- with more information than before.
- Also, the <a href="/pkg/net/#OpError"><code>OpError</code></a>
- type now includes a <code>Source</code> field that holds the local
- network address.
- </li>
- <li>
- The <a href="/pkg/net/http/"><code>net/http</code></a> package now
- has support for setting trailers from a server <a href="/pkg/net/http/#Handler"><code>Handler</code></a>.
- For details, see the documentation for
- <a href="/pkg/net/http/#ResponseWriter"><code>ResponseWriter</code></a>.
- </li>
- <li>
- There is a new method to cancel a <a href="/pkg/net/http/"><code>net/http</code></a>
- <code>Request</code> by setting the new
- <a href="/pkg/net/http/#Request"><code>Request.Cancel</code></a>
- field.
- It is supported by <code>http.Transport</code>.
- The <code>Cancel</code> field's type is compatible with the
- <a href="https://godoc.org/golang.org/x/net/context"><code>context.Context.Done</code></a>
- return value.
- </li>
- <li>
- Also in the <a href="/pkg/net/http/"><code>net/http</code></a> package,
- there is code to ignore the zero <a href="/pkg/time/#Time"><code>Time</code></a> value
- in the <a href="/pkg/net/#ServeContent"><code>ServeContent</code></a> function.
- As of Go 1.5, it now also ignores a time value equal to the Unix epoch.
- </li>
- <li>
- The <a href="/pkg/net/http/fcgi/"><code>net/http/fcgi</code></a> package
- exports two new errors,
- <a href="/pkg/net/http/fcgi/#ErrConnClosed"><code>ErrConnClosed</code></a> and
- <a href="/pkg/net/http/fcgi/#ErrRequestAborted"><code>ErrRequestAborted</code></a>,
- to report the corresponding error conditions.
- </li>
- <li>
- The <a href="/pkg/net/http/cgi/"><code>net/http/cgi</code></a> package
- had a bug that mishandled the values of the environment variables
- <code>REMOTE_ADDR</code> and <code>REMOTE_HOST</code>.
- This has been fixed.
- Also, starting with Go 1.5 the package sets the <code>REMOTE_PORT</code>
- variable.
- </li>
- <li>
- The <a href="/pkg/net/mail/"><code>net/mail</code></a> package
- adds an <a href="/pkg/net/mail/#AddressParser"><code>AddressParser</code></a>
- type that can parse mail addresses.
- </li>
- <li>
- The <a href="/pkg/net/smtp/"><code>net/smtp</code></a> package
- now has a <a href="/pkg/net/smtp/#Client.TLSConnectionState"><code>TLSConnectionState</code></a>
- accessor to the <a href="/pkg/net/smtp/#Client"><code>Client</code></a>
- type that returns the client's TLS state.
- </li>
- <li>
- The <a href="/pkg/os/"><code>os</code></a> package
- has a new <a href="/pkg/os/#LookupEnv"><code>LookupEnv</code></a> function
- that is similar to <a href="/pkg/os/#Getenv"><code>Getenv</code></a>
- but can distinguish between an empty environment variable and a missing one.
- </li>
- <li>
- The <a href="/pkg/os/signal/"><code>os/signal</code></a> package
- adds new <a href="/pkg/os/signal/#Ignore"><code>Ignore</code></a> and
- <a href="/pkg/os/signal/#Reset"><code>Reset</code></a> functions.
- </li>
- <li>
- The <a href="/pkg/runtime/"><code>runtime</code></a>,
- <a href="/pkg/runtime/trace/"><code>runtime/trace</code></a>,
- and <a href="/pkg/net/http/pprof/"><code>net/http/pprof</code></a> packages
- each have new functions to support the tracing facilities described above:
- <a href="/pkg/runtime/#ReadTrace"><code>ReadTrace</code></a>,
- <a href="/pkg/runtime/#StartTrace"><code>StartTrace</code></a>,
- <a href="/pkg/runtime/#StopTrace"><code>StopTrace</code></a>,
- <a href="/pkg/runtime/trace/#Start"><code>Start</code></a>,
- <a href="/pkg/runtime/trace/#Stop"><code>Stop</code></a>, and
- <a href="/pkg/net/http/pprof/#Trace"><code>Trace</code></a>.
- See the respective documentation for details.
- </li>
- <li>
- The <a href="/pkg/runtime/pprof/"><code>runtime/pprof</code></a> package
- by default now includes overall memory statistics in all memory profiles.
- </li>
- <li>
- The <a href="/pkg/strings/"><code>strings</code></a> package
- has a new <a href="/pkg/strings/#Compare"><code>Compare</code></a> function.
- This is present to provide symmetry with the <a href="/pkg/bytes/"><code>bytes</code></a> package
- but is otherwise unnecessary as strings support comparison natively.
- </li>
- <li>
- The <a href="/pkg/sync/#WaitGroup"><code>WaitGroup</code></a> implementation in
- package <a href="/pkg/sync/"><code>sync</code></a>
- now diagnoses code that races a call to <a href="/pkg/sync/#WaitGroup.Add"><code>Add</code></a>
- against a return from <a href="/pkg/sync/#WaitGroup.Wait"><code>Wait</code></a>.
- If it detects this condition, the implementation panics.
- </li>
- <li>
- In the <a href="/pkg/syscall/"><code>syscall</code></a> package,
- the Linux <code>SysProcAttr</code> struct now has a
- <code>GidMappingsEnableSetgroups</code> field, made necessary
- by security changes in Linux 3.19.
- On all Unix systems, the struct also has new <code>Foreground</code> and <code>Pgid</code> fields
- to provide more control when exec'ing.
- On Darwin, there is now a <code>Syscall9</code> function
- to support calls with too many arguments.
- </li>
- <li>
- The <a href="/pkg/testing/quick/"><code>testing/quick</code></a> will now
- generate <code>nil</code> values for pointer types,
- making it possible to use with recursive data structures.
- Also, the package now supports generation of array types.
- </li>
- <li>
- In the <a href="/pkg/text/template/"><code>text/template</code></a> and
- <a href="/pkg/html/template/"><code>html/template</code></a> packages,
- integer constants too large to be represented as a Go integer now trigger a
- parse error. Before, they were silently converted to floating point, losing
- precision.
- </li>
- <li>
- Also in the <a href="/pkg/text/template/"><code>text/template</code></a> and
- <a href="/pkg/html/template/"><code>html/template</code></a> packages,
- a new <a href="/pkg/text/template/#Template.Option"><code>Option</code></a> method
- allows customization of the behavior of the template during execution.
- The sole implemented option allows control over how a missing key is
- handled when indexing a map.
- The default, which can now be overridden, is as before: to continue with an invalid value.
- </li>
- <li>
- The <a href="/pkg/time/"><code>time</code></a> package's
- <code>Time</code> type has a new method
- <a href="/pkg/time/#Time.AppendFormat"><code>AppendFormat</code></a>,
- which can be used to avoid allocation when printing a time value.
- </li>
- <li>
- The <a href="/pkg/unicode/"><code>unicode</code></a> package and associated
- support throughout the system has been upgraded from version 7.0 to
- <a href="http://www.unicode.org/versions/Unicode8.0.0/">Unicode 8.0</a>.
- </li>
- </ul>
|