The State of Go 1.10

5 min read Original article ↗

Transcript

  1. Changes To The Language

  2. Changes To The Language source

  3. Ports

  4. New Ports source

  5. Notes On Existing Ports FreeBSD: requires FreeBSD 10.3 or later

    NetBSD: works but requires NetBSD 8 ... which is not released yet OpenBSD: next version will require OpenBSD 6.2 OS X: next version will require OS X 10.10 Yosemite Windows: next version will require Windows 7 (no more XP or Vista) 32-bits MIPS have now a new GOMIPS variable (hard oat | softfloat)

  6. Changes To The Tooling

  7. Changes To The Tooling In two words: easier and faster.

  8. Testing Also caches results, everything is faster ➜ go test

    strings ok strings (cached) In order to bypass the cachee use -count=1 ➜ go test -count=1 strings ok strings 0.295s Also runs vet, some of your tests might fail. Also: coverprofile can be done over many tests too new -failfast and -json ags

  9. A Small Detour

  10. Three-Index Slicing Did you know you can use three values

    for slicing? text := []byte("Hello FOSDEM!") fmt.Printf("text: %s", desc(text)) hello := text[0:5] fmt.Printf("hello: %s", desc(hello)) hello = append(hello, '#') fmt.Printf("hello: %s", desc(hello)) fmt.Printf("text: %s", desc(text)) Run

  11. Changes To The Standard Library

  12. Changes to bytes Fields, FieldsFunc, Split, and SplitAfter limit the

    capacity of the returned slices. playground text := []byte("Hello FOSDEM!") fmt.Printf("text: %s", desc(text)) hello := bytes.Fields(text)[0] fmt.Printf("hello: %s", desc(hello)) hello = append(hello, '#') fmt.Printf("hello: %s", desc(hello)) fmt.Printf("text: %s", desc(text)) Run

  13. Changes to ags This is minor, but I am very

    happy about it! Before -s int some other stuff it's long to explain -z int some number (default 42) Now -s int some other stuff it's long to explain -z int some number (default 42) stuff := flag.Int("s", 0, "some other stuff\nit's long to explain") z := flag.Int("z", 42, "some number") flag.Parse() Run

  14. Changes to go/doc For a type T, functions returning slices

    of T, *T, or **T are now linked to T. Those functions now appear in the Funcs list of the type, not the package. Example: package things // Thing is stuff. type Thing struct{} // NewThing returns a new thing. func NewThing() *Thing { return nil } // ManyThings returns many new things. func ManyThings() []Thing { return nil }

  15. Changes to text/template New {{break}} and {{continue}} for {{range}}. Note:

    Interestingly, this is not implemented in the html package. var tmpl = template.Must(template.New("example").Funcs(template.FuncMap{ "even": func(x int) bool { return x%2 == 0 }, }).Parse(` {{ range . }} {{ . }} {{ if even . -}} even {{ continue }} {{ end -}} odd {{ if eq . 5 }} {{ break }} {{ end }} {{ end }} `)) Run

  16. strings I'm sure you've written this kind of code before.

    But there's some issues with it. String creates allocations since it convers []byte to string. There could be a better and simpler way to do this. This uses unsafe to avoid copies in the creation of strings. var buf bytes.Buffer fmt.Fprintln(&buf, "Hello, FOSDEM gophers!") fmt.Printf(buf.String()) Run var b strings.Builder fmt.Fprintln(&b, "Hello, FOSDEM gophers!") fmt.Printf(b.String()) Run

  17. strings.Builder When you're creating many strings, it is de nitely

    worth it. for i := 0; i < 10000; i++ { fmt.Fprintf(w, " ") out = w.String() } Benchmark results: $ go test -bench=. -benchmem goos: darwin goarch: amd64 pkg: github.com/campoy/talks/go1.10/strings BenchmarkBuffer-4 100 20861915 ns/op 215641272 B/op 10317 allocs/op BenchmarkBuilder-4 3000 535081 ns/op 153647 B/op 22 allocs/op PASS ok github.com/campoy/talks/go1.10/strings 3.626s

  18. strings.Builder When you're creating many strings, it is de nitely

    worth it. for i := 0; i < 10000; i++ { fmt.Fprintf(w, " ") // out = w.String() } Benchmark results: $ go test -bench=. -benchmem goos: darwin goarch: amd64 pkg: github.com/campoy/talks/go1.10/strings BenchmarkBuffer-4 3000 525691 ns/op 152056 B/op 11 allocs/op BenchmarkBuilder-4 3000 626132 ns/op 153647 B/op 22 allocs/op PASS ok github.com/campoy/talks/go1.10/strings 4.072s

  19. unicode source

  20. unicode oh my gopher!

  21. unicode sure ... why not

  22. unicode roar

  23. unicode mind blown

  24. Performance Changes

  25. Compiler Performance Compiling the standard library is 10% faster! $

    benchstat go1.9.3.txt go.1.10rc1.txt name old time/op new time/op delta Template 234ms ± 4% 231ms ± 4% ~ (p=0.101 n=10+8) Unicode 107ms ± 1% 109ms ± 6% ~ (p=0.211 n=9+10) GoTypes 742ms ± 2% 744ms ± 2% ~ (p=0.905 n=9+10) Compiler 3.50s ± 3% 3.54s ± 5% ~ (p=0.393 n=10+10) SSA 6.95s ± 4% 9.04s ± 5% +29.98% (p=0.000 n=10+10) Flate 149ms ± 2% 147ms ± 5% -1.53% (p=0.035 n=10+9) GoParser 189ms ± 3% 183ms ± 3% -3.44% (p=0.002 n=9+9) Reflect 476ms ± 5% 489ms ± 6% +2.90% (p=0.043 n=10+10) Tar 134ms ± 1% 220ms ± 3% +64.14% (p=0.000 n=9+10) XML 258ms ± 6% 266ms ± 6% +2.90% (p=0.043 n=10+10) StdCmd 19.1s ± 1% 17.1s ± 3% -10.57% (p=0.000 n=10+10) Following https://golang.org/x/tools/cmd/compilebench. Run on a Google Compute Engine instance with 8 cores.

  26. Garbage Collector History in Tweets

  27. go 1.5

  28. go 1.6

  29. go 1.7

  30. go 1.8 (beta 1)

  31. go 1.9 (beta 1)

  32. and nally, go 1.10

  33. and nally, go 1.10

  34. and nally, go 1.10

  35. and then this morning ...

  36. and the this morning ...

  37. A couple more changes too Go 1.10 release notes (DRAFT)

  38. Changes To The Community

  39. Women Who Go Leaders

  40. Conferences: Go Devroom FOSDEM Today and here! GopherCon India -

    March in Pune, India GopherCon Russia - March in Moscow, Russia GoSF - March in San Francisco, USA GothamGo - April in New York, USA GopherCon SG - May in Singapore GopherCon Europe - June in Reykjavik, Iceland GopherCon Denver - August in Denver, USA GopherCon Brasil - September in Florianópolis, Brazil GoLab - October in Florence, Italy dotGo - March 2019 in Paris, France

  41. Schedule