blob: fc2738e7fea6a7be76ffc875ce402b2bfb4e997c [file] [log] [blame]
The State of Go
Where we are in May 2017
Francesc Campoy
Google Developer Advocate
@francesc
campoy@golang.org
* Recording
A recording of this talk is available [[https://www.youtube.com/watch?v=dyvpF0jF3AY&list=PLtLJO5JKE5YAeVbgwCkgUWyOBsMvZu4UB&index=1][here]].
.image https://img.youtube.com/vi/dyvpF0jF3AY/0.jpg
* 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 [[https://talks.golang.org/2017/state-of-go-may.slide]]
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 [[https://talks.golang.org/2016/refactor.article][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("https://golang.org")
res, err := http.DoGetPleaseAndThanks("https://golang.org")
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 [[https://golang.org/issue/19813][issue #19813]]
* The Standard library
* A Twitter Poll
.image state-of-go-may/img/twitter-poll.png _ 800
.caption [[https://twitter.com/francesc/status/863514399486623744][twitter poll]]
* math/bits
[[https://tip.golang.org/pkg/math/bits/#Len16][Package bits]] implements bit counting and manipulation functions for the predeclared unsigned integer types.
Added to the standard library with proposal [[https://golang.org/issue/18616][#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 [[https://golang.org/issue/18177][#18177]].
[[https://tip.golang.org/pkg/sync/#Map][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 [[https://play.golang.org/p/-z5rZilH1F][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
bar
* 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 [[https://twitter.com/francesc/status/863791506934472705][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
[[https://en.wikipedia.org/wiki/DWARF][DWARF]]
- 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.
cmd/go/internal/...
Issue [[https://golang.org/issue/17639][#17639]] made parsing concurrent.
The compiler is faster as a result.
* go test
`vendor` directories are ignored by the `go` tool [[https://golang.org/issue/19090][#19090]]:
go test ./...
You can now list all the tests to be executed, without running them [[https://golang.org/issue/17209][#17209]].
$ go test -test.list .
TestIntegration
TestEmbedStreams
TestEmbedFiles
* godoc
You can now link to fields in a struct in the documentation [[https://golang.org/issue/16753][#16753]].
.link https://tip.golang.org/pkg/net/http/#Client.Transport
_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! [[http://go-meetups.appspot.com]]
* Women Who Go
.image state-of-go-may/img/wwg.png _ 800
.caption 19 chapters already! [[http://www.womenwhogo.org]]
* 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:
- [[http://gophercon.sg][Gophercon Singapore]], May 25-26th
- [[https://gophercon.com/][Gophercon Denver]], Jul 12-15th
- [[http://golanguk.com/][Golang UK]], August 16th-18th
- [[http://2017.dotgo.eu/][dotGo]], Nov 6th