Transcript
-
Changes To The Language
-
Changes To The Language source
-
Ports
-
New Ports source
-
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)
-
Changes To The Tooling
-
Changes To The Tooling In two words: easier and faster.
-
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
-
A Small Detour
-
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
-
Changes To The Standard Library
-
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
-
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
-
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 }
-
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
-
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
-
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
-
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
-
unicode source
-
unicode oh my gopher!
-
unicode sure ... why not
-
unicode roar
-
unicode mind blown
-
Performance Changes
-
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.
-
Garbage Collector History in Tweets
-
go 1.5
-
go 1.6
-
go 1.7
-
go 1.8 (beta 1)
-
go 1.9 (beta 1)
-
and nally, go 1.10
-
and nally, go 1.10
-
and nally, go 1.10
-
and then this morning ...
-
and the this morning ...
-
A couple more changes too Go 1.10 release notes (DRAFT)
-
Changes To The Community
-
Women Who Go Leaders
-
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
-
Schedule