Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Let's Play with Golang 1.18

omissis
April 27, 2022

Let's Play with Golang 1.18

Slides of the Turin Golang Meetup

omissis

April 27, 2022
Tweet

More Decks by omissis

Other Decks in Programming

Transcript

  1. Let's play with Go 1.18! Claudio Beatrice - April 27th,

    2022 Having fun fun fun 🕺 with Generics, Fuzzing and Workspace Mode
  2. Introducing Go 1.18 This is the best iPhone we’ve ever

    made • It was released on Mar 15th, 2022 , seven months after Go 1.17 📆 • It’s one of the major changes in the language ever done 🚛 • It packs a TON of new features, plus library and tooling improvements • Generics 㿂 • Fuzzing 🎛 • Workspace mode 🗃 • Sane packages for sorting stuff! 🥇 • It keeps the Compatibility Promise, as usual 😎
  3. Generics One does not simply write speci f ic code

    • Write functions or types that are written work with any of a set of types provided by the calling code • Generic code is independent of the speci f ic types being used • Generics adds three new big things to the language: • Type parameters • Type inference • Interface types as sets of types
  4. Generics Type Parameters func Min[T constraints.Ordered](x, y T) T {

    func Min(x, y int) int { As opposed to the an equivalent (for ints) monomorphic version
  5. Generics Type Sets package constraints type Ordered interface { Integer|Float|~string

    } Interfaces may now be used as type constraints, and they support union of different types.
  6. Generics Bracket beats chevron package main import "fmt" import "golang.org/x/exp/constraints"

    func Min[T constraints.Ordered](x, y T) T { if x < y { return x } return y } func main() { fmt.Println(Min[int](2, 3)) fmt.Println(Min[float32](2.5, 2.6)) }
  7. Generics Chevron cuts paper package main import "fmt" func Min(x,

    y int) int { if x < y { return x } return y } func main() { fmt.Println(Min(2, 3)) fmt.Println(Min(2.5, 2.6)) // Error! }
  8. Fuzzing Get cover! Fuzzing is a type of automated testing

    which continuously manipulates inputs to a program to f ind bugs. Good for f inding edge cases: it’s an extremely valuable feat whenever security is concerned, and still very valuable to hunt down hard-to- f ind bugs.
  9. Workspace mode It ain’t much, but it’s honest go work

    • A new, optional go.work f ile has been introduced: if present, it will set Go in Worskpace Mode. • When in Worskpace Mode, go will use the go.work f ile to determine all the modules to use as roots for module resolution, as opposed to having a single one as imposed by go.mod • Such Mode allows for work on multiple, independent modules at the same time more conveniently than it was in the past
  10. Workspace mode It ain’t much, but it’s honest go work

    go 1.18 use ../foo/bar use ./baz replace example.com/foo v1.2.3 => example.com/bar v1.4.5
  11. New experimental packages Sort like it’s 2022 • https://pkg.go.dev/golang.org/x/exp/constraints •

    https://pkg.go.dev/golang.org/x/exp/slices • https://pkg.go.dev/golang.org/x/exp/maps
  12. New networking package It’s a net improvement • New net/netip

    package, featuring Addr and AddrPort types • Compared to net.IP, netip.Addr is more memory ef f icient, immutable, comparable and can be used as a map key • Besides an IP and a port, AddrPort can also represent a CIDR pre f ix • Tons of new functions to work on the newly de f ined types • Loads of helpers for bridging with the old net.IP package
  13. And moar! Faster and furiouser, sometimes • More ef f

    icient way to pass function argument on arm64 and some amd64, getting up to 10% performance improvements • Due to generics, compile speed can get about 15% slower than go 1.17 • Nice strings functions improvements, hello Cut()! • Ditto for bytes • Introduces the new any identi f ier as an alias for interface{} • Loads of other little minor changes
  14. Bibliography Slides are important, but study is importanter • Go

    1.18 Release Notes • Article: An Introduction to Generics • Article: Are Go Generics ready for Prime Time? • Documentation: Fuzzing • Reference: Go Workspaces