blob: c28bc3aec580c8d7fb073542ae8bbb2e00f6d524 [file] [log] [blame]
The State of Go
Where we are in May 2017
Francesc Campoy
Google Developer Advocate
* Recording
A recording of this talk is available [[][here]].
* Time flies
Go 1.7 is already 9 months old!
Go 1.8 was released on February 16th.
On May 1st we entered the release freeze for Go 1.9
Go 1.9 will be released early August.
.image state-of-go-may/img/flying.png
* Notes
The slides are available on [[]]
Most of the code examples won't run except locally and using tip.
The playground runs Go 1.8.
* Agenda
Changes since Go 1.8:
- The Language
- The Standard Library
- The Runtime
- The Tooling
- The Community
* Changes to the language
* Codebase Refactoring (with help from Go)
Article written by Russ Cox [[][link]]
.image state-of-go-may/img/atomic.svg _ 300
* Gradual Code Repair
In reality, atomically changing all usages of an API is often impossible.
.image state-of-go-may/img/gradual.svg _ 600
* An example
Imagine we created a new package `net/http/status`.
First: create the new API
package status
const OK = http.StatusOK
Second: change each usage of `http.StatusOK` by `status.OK`.
if res.StatusCode != http.StatusOK {
if res.StatusCode != status.OK {
Third: remove the old API
* Another example
Let's rename `http.Get` to `http.DoGetPleaseAndThanks`.
First: create the new API
func DoGetPleaseAndThanks(url string) (*http.Response, error) {
return Get(url)
Second: change each usage of `http.Get` to `http.DoGetPleaseAndThanks`.
res, err := http.Get("")
res, err := http.DoGetPleaseAndThanks("")
Third: remove the old API
* One last example
Let's move `http.Client` to `http.Applicant`.
First: create the new API
type Applicant Client
- `Applicant` has no methods.
- Both types are convertible.
type Applicant struct { Client }
- `Applicant` has all the methods of `Client`
- The types are not convertible.
* Alias declarations
An alias declaration is a new kind of type declaration.
type Applicant = http.Client
Both types are equivalent and completely interchangeable.
- type conversion is not needed
- can't declare methods on the alias declaration
.play state-of-go-may/alias/main.go /type/,
* Quaternions
.image state-of-go-may/img/quaternions.png _ 750
.caption [[][issue #19813]]
* The Standard library
* A Twitter Poll
.image state-of-go-may/img/twitter-poll.png _ 800
.caption [[][twitter poll]]
* math/bits
[[][Package bits]] implements bit counting and manipulation functions for the predeclared unsigned integer types.
Added to the standard library with proposal [[][#18616]].
- LenXX, OnesCountXX
- ReverseXX, ReverseBytesXX
- RotateLeftXX
- LeadingZerosXX, TrailingZerosXX
.play state-of-go-may/bits/main.go /START/,/END/
* sync.Map
A new type has been added to the `sync` package with proposal [[][#18177]].
[[][sync.Map]] is a concurrent map with amortized-constant-time loads, stores,and deletes.
- the zero map is valid
- it must not be copied (use pointers)
* sync.Map code sample
.play state-of-go-may/syncmap/main.go /func main/,
* html/template panic on predefined escaper
What do you expect [[][this code]] to print?
.play state-of-go-may/html/main.go /Foo/,
Predefined escapers in `html` template create a security concern.
Since 1.9 `Execute` will panic.
* os.Exec
Let's imagine that we have a command `getenv` that prints an environment variable
using `os.Getenv`.
.code state-of-go-may/exec/getenv/main.go /func main/,
We can run it as follows:
$ foo=bar getenv foo
* os.Exec
What do you expect this code to print?
.code state-of-go-may/exec/main.go /func main/,
bar, or newbar?
* another Twitter poll
.image state-of-go-may/img/exec-poll.png _ 600
.caption [[][Twitter poll]]
* os.Exec
`Cmd.Start` now removes duplicates of environment variables, keeping the last one.
This code does what one expects:
cmd := exec.Command("prog")
cmd.Env = append(os.Environ(), "FOO=bar")
* The Runtime
* Benchmarks
.image state-of-go-may/img/benchmark.png _ 800
.caption _note_: values over 1.0 mean tip is faster
.caption _note_: unofficial benchmark ran on my laptop while playing YouTube videos
* More runtime
Garbage Collector
- New algorithm for large object allocation
- Better performance and increased determinism for large (+50GB) heaps
- Ongoing effort to improve the generated DWARF information.
- This will help debuggers, among other tools.
* The Tooling
* go compiler: better errors!
Better error messaging for Allman style braces.
package main
func main()
fmt.Println("that ain't gonna compile")
With go 1.8:
fail/main.go:4: syntax error: unexpected semicolon or newline before {
With go 1.9:
fail/main.go:3:6: missing function body for "main"
fail/main.go:4:1: syntax error: unexpected semicolon or newline before {
* go compiler: more modular and faster
The compiler has been refactored into multiple packages.
Issue [[][#17639]] made parsing concurrent.
The compiler is faster as a result.
* go test
`vendor` directories are ignored by the `go` tool [[][#19090]]:
go test ./...
You can now list all the tests to be executed, without running them [[][#17209]].
$ go test -test.list .
* godoc
You can now link to fields in a struct in the documentation [[][#16753]].
_Note_: This was actually introduced with Go 1.8!
* ... and much more!
* The community
* Go meetups
.image state-of-go-may/img/meetups.png _ 900
.caption Gophers all around the world! [[]]
* Women Who Go
.image state-of-go-may/img/wwg.png _ 800
.caption 19 chapters already! [[]]
* Women Who Go Gophercon Scholarship
WWG is sponsoring minority gophers from all over the world to attend Gophercon
.image state-of-go-may/img/wwg-logo.png _ 700
* Conferences:
- [[][Gophercon Singapore]], May 25-26th
- [[][Gophercon Denver]], Jul 12-15th
- [[][Golang UK]], August 16th-18th
- [[][dotGo]], Nov 6th