blob: cd5146938d8f427f66b089e30a52661c7d393955 [file] [log] [blame]
The State of Go
Where we are in February 2016
Francesc Campoy
Gopher at Google
@francesc
campoy@golang.org
* Time flies
Go 1.4 is one year old (happy birthday!)
Go 1.5 is already 6 months old!
Go 1.6 to be released sometime in February.
Go 1.6 Candidate Release 1 was released on January 28th
* Notes
The slides are available on [[https://go.dev/talks/2016/state-of-go.slide]]
Most of the code examples won't run except locally and using Go 1.6.
The playground still runs Go 1.5.
* Agenda
Changes since Go 1.5:
- the language
- the standard library
- the runtime
- the tooling
- the community
* Changes to the language
* Changes to the language
None.
This is a feature.
* Changes to the standard library
* Changes to the standard library
A couple of new things, in order of excitement.
- net/http
- {text,html}/template
- sort
Also more speed and fewer bugs.
* net/http
If:
- you're using HTTPS
- and Go 1.6
you're using HTTP/2!
* HTTP/2
At a high level, HTTP/2:
- is binary, instead of textual
- is fully multiplexed, instead of ordered and blocking
- can therefore use one connection for parallelism
- uses header compression to reduce overhead
- allows servers to “push” responses proactively into client caches
.link https://http2.golang.org/gophertiles
* text/template
Imagine that given a slice of strings:
[]string{"one", "two", "three"}
We want to write a template that will generate:
<ul>
<li>one</li>
<li>two</li>
<li>three</li>
</ul>
What template would you write?
* text/template: first try
Naturally, I write this:
.play state-of-go/template/old.go /`/,/`/
But unfortunately it's not exactly what I want!
* text/template: let's fix it
We need to be careful with the line breaks.
.play state-of-go/template/fixed.go /`/,/`/
This works now, but ... I don't really like my code!
* text/template: meet {{- and -}}
Go 1.6 brings two new delimiters:
- `{{-`
- `-}}`
Similar to `{{` and `}}`, but _all_ white space on the `-` side will be trimmed.
The template:
{{23 -}}
<
{{- 45}}
generates:
23<45
* text/template: back to our problem
We can now have:
- the result we expected
- without sacrificing the readability of our templates.
.play state-of-go/template/new.go /`/,/`/
* text/template: the block action
Go 1.6 brings also a new action named `block`.
Let's see what it is useful for.
* Factoring out repetition in templates
Both `<ul>` share the same structure.
{{define "presentation"}}
Authors:
<ul>
{{range .Authors}}
<li>{{.}}</li>
{{end}}
</ul>
Topics:
<ul>
{{range .Topics}}
<li>{{.}}</li>
{{end}}
</ul>
{{end}}
Templates can be used to avoid repetition.
* Factoring out repetition with templates (cont.)
We can define a new template:
.code state-of-go/template/define.go /define "list"/,/^{{end}}/
And use it where needed:
.code state-of-go/template/define.go /define "presentation"/,/^{{end}}/
* Factoring out repetition with templates (cont.)
We can parse that template and execute it.
.play state-of-go/template/define.go /func main/,/^}/
* Template redefinition
We made also our template easier to reuse, as we can redefine `list`.
.play state-of-go/template/redefine.go /func main/,/^}/
* Meet the block action
The `block` action defines and executes a template in place.
.code state-of-go/template/blocks.go /define/,/`/
That template defined by `block` can be:
- referenced later by the same template,
- redefined with `define`.
* Why do we need it?
It is more compact when
- we're not factoring out repetition,
- but we need to provide an extension point.
We can make the following template more compact with `block`.
{{define "content" .}}
<h1>{{.Heading}}<h1>
<p>{{.Content}}</p>
{{end}}
{{define "page"}}
<title>{{.Title}}</title>
<body>
{{template "content" .}}
</body>
{{end}}
* Why do we need it? (cont.)
We can make the following template more compact with `block`.
{{define "page"}}
<title>{{.Title}}</title>
<body>
{{block "content" .}}
<h1>{{.Heading}}<h1>
<p>{{.Content}}</p>
{{end}}
</body>
{{end}}
And still easily redefine `content`.
* sort.Sort is faster
`Sort` sorts your data by calling `Less`, `Swap`, and `Len`.
We reduced the number of comparisons and swaps by about 10%.
Sort `[]int` with Go 1.5
BenchmarkSort_1-4 20000000 67.2 ns/op
BenchmarkSort_10-4 10000000 227 ns/op
BenchmarkSort_100-4 500000 3863 ns/op
BenchmarkSort_1000-4 30000 52189 ns/op
Sort `[]int` with Go 1.6
BenchmarkSort_1-4 20000000 64.7 ns/op
BenchmarkSort_10-4 10000000 137 ns/op
BenchmarkSort_100-4 500000 2849 ns/op
BenchmarkSort_1000-4 30000 46949 ns/op
* sort.Sort is faster - plot
.image state-of-go/img/bench-sort.png _ 800
* Sort order and sort.Stable
Reminder: sort.Sort is not a _stable_ sort.
.play state-of-go/sort/unstable.go /byLength/,
Use `sort.Stable`:
.play state-of-go/sort/stable.go /func main/,
* Minor changes
.image state-of-go/img/minorchanges.png _ 900
.caption too many to discuss: find them [[https://golang.org/doc/go1.6#minor_library_changes][here]]
* Let's just discuss one
`time.Parse` is smarter!
.play state-of-go/time/time.go /func main/,/^}/
* Changes to the runtime
* Detection of concurrent map accesses
Detection of unsafe concurrent access to maps.
.play state-of-go/runtime/crash.go /const/,/Wait\(\)/
Outputs:
fatal error: concurrent map read and map write
fatal error: concurrent map writes
* Does it make it slower?
No!
Let's benchmark it - with a correct solution.
.code state-of-go/runtime/good/good.go /func count/,/^}/
* Benchmark results
Go 1.4 - GOMAXPROCS = 4
BenchmarkCount_1 1000000 1862 ns/op
BenchmarkCount_10 100000 21214 ns/op
BenchmarkCount_100 1000 1602507 ns/op
BenchmarkCount_1000 10 141712948 ns/op
Go 1.5 - GOMAXPROCS = 4
BenchmarkCount_1-4 2000000 867 ns/op
BenchmarkCount_10-4 200000 6909 ns/op
BenchmarkCount_100-4 1000 1025092 ns/op
BenchmarkCount_1000-4 20 94093719 ns/op
Go 1.6 - GOMAXPROCS = 4
BenchmarkCount_1-4 2000000 750 ns/op
BenchmarkCount_10-4 200000 6582 ns/op
BenchmarkCount_100-4 2000 1113790 ns/op
BenchmarkCount_1000-4 20 87998054 ns/op
* Benchmark results plot
.image state-of-go/img/bench4.png _ 800
* Benchmark results
Go 1.4 - GOMAXPROCS = 1
BenchmarkCount_1 100000 1370 ns/op
BenchmarkCount_10 20000 8622 ns/op
BenchmarkCount_100 500 362725 ns/op
BenchmarkCount_1000 50 31378803 ns/op
Go 1.5 - GOMAXPROCS = 1
BenchmarkCount_1-4 2000000 776 ns/op
BenchmarkCount_10-4 200000 6288 ns/op
BenchmarkCount_100-4 3000 345037 ns/op
BenchmarkCount_1000-4 50 31751625 ns/op
Go 1.6 - GOMAXPROCS = 1
BenchmarkCount_1-4 2000000 767 ns/op
BenchmarkCount_10-4 200000 6041 ns/op
BenchmarkCount_100-4 5000 329328 ns/op
BenchmarkCount_1000-4 50 30176034 ns/op
* Benchmark results plot
.image state-of-go/img/bench1.png _ 800
* Garbage Collector in Go 1.5
At [[https://www.youtube.com/watch?v=aiv1JOfMjm0][GopherCon 2015 Rick Hudson gave a presentation]] about the Go 1.5 low latency collector
.image state-of-go/img/gc345.png 500 _
* Garbage Collector in Go 1.6
At [[http://www.infoq.com/presentations/go-gc-performance][QCon SF in November Rick Hudson]] gave an updated presentation which showed this comparison of Go 1.5 to the upcoming Go 1.6
.image state-of-go/img/gc56.png 400 _
_Yes,_that_is_gigabytes_on_the_X_axis_
* Garbage Collector on tip
Right now it's even better!
.image state-of-go/img/gcgotip.png _ 600
* People loved it with Go 1.5
.image state-of-go/img/twitter1.png _ 550
.caption [[https://twitter.com/brianhatfield/status/634166123605331968][original tweet]]
* People love it even more with Go 1.6
.image state-of-go/img/twitter2.png _ 600
.caption [[https://twitter.com/brianhatfield/status/692778741567721473][original tweet]]
* Oops
.image state-of-go/img/twitter3.png _ 600
.caption [[https://twitter.com/bradfitz/status/692787593558118400][original tweet]] and [[https://www.youtube.com/watch?v=CduA0TULnow&t=1m29s][video]]
* New ports
Experimental ports to Linux on 64-bit MIPS (linux/mips64 and linux/mips64le).
Experimental port to Android on 32-bit x86 (android/386).
On Linux on little-endian 64-bit PowerPC (linux/ppc64le), Go 1.6 now supports cgo with external linking and is roughly feature complete.
On NaCl, Go 1.5 required SDK version pepper-41. Go 1.6 adds support for later SDK versions.
* Changes to the tooling
* The cgo tool
Go is garbage collected, can C and Go share memory?
In short:
- Go can pass a pointer to C
- the referenced memory can't have pointers to Go allocated memory
- C can't keep pointers to the memory after the call returns
In more detail:
- the `cgo` [[https://tip.golang.org/cmd/cgo/#hdr-Passing_pointers][docs]].
This is checked by the runtime at execution.
You could disable the checks, but you probably shouldn't.
* Sharing pointers between Go and C
.code state-of-go/cgo/main.go
Outputs:
panic: runtime error: cgo argument has Go pointer to Go pointer
* The go tool
GO15VENDOREXPERIMENT is now enabled by default.
How does it work?
/home/user/gocode/
src/
server-one/
main.go (import "github.com/gorilla/mux")
server-two/
main.go (import "github.com/gorilla/mux")
vendor/
github.com/
gorilla/
mux/
...
`server-one` uses the `mux` package in `$GOPATH/src/github.com/gorilla/mux`.
`server-two` uses the `mux` package in `vendor`.
* Vendoring demo
* go doc
Go 1.5 added the possibility of searching by name
go doc math Pi
Go 1.6 defines priority of packages with import paths with less elements.
Non vendored packages appear first.
* go vet
Go vet warns if the code prints a function instead of its result.
.play state-of-go/govet/main.go
`go`vet` output:
main.go:8: arg foo in Println call is a function value, not a function call
The warning can be removed using `%p` in the format string.
* The community
* The community
Code of Conduct announced on November 24th 2015
Go meetups:
- [[http://go-meetups.appspot.com]]
Women Who Go - 7 chapters already!
- [[http://www.womenwhogo.org]]
* Conferences:
- [[http://gophergala.com/][GopherGala]] Jan 22-24th (judging proposals now)
- [[https://fosdem.org/2016/][FOSDEM]] Right here, right now. Hello!
- [[http://gophercon.ae][GopherCon Dubai]], Feb 23rd
- [[http://www.gophercon.in/][GopherCon India]], Feb 19-20th
- [[https://gophercon.com/][Gophercon Denver]], Jul 11-13th
- [[http://2016.dotgo.eu/][dotGo]], Nov 9th
* Go 1.6 release party, February 17th
Go 1.6 ships soon!
Go meetups are organising to hold a [[https://github.com/golang/go/wiki/Go-1.6-release-party][release party]] on the 17th of February.
.image state-of-go/img/party-gopher.png _ 300
.caption Join the party!!!