o porquê de

 

Natan Streppel

  • Apaixonou-se por Go em 2018
  • Atua como desenvolvedor backend Kotlin & Go
  • Grande zelo por código limpo e abordagens testáveis
  •  

Por quê Go?

Constante ascensão no mundo real

Lang com o maior crescimento de pr's no GitHub em 2018/2

Lang com o maior crescimento de pr's no GitHub em 2018/2

Crescimento acirrado (0.176%) com Typescript

 

Continua recebendo muita atenção da comunidade, ano após ano

Stackoverflow developer survey 2019

Industry-proven

Ok. Mas... por quê Go?

Tooling

Go oferece muitas ferramentas out-of-the-box

Lightweight built-in

test framework com

go test

// Rodamos com $ go test
// Função é identificada como teste pelo nome
// Xxx não pode começar com letra minúscula
func TestXxx(t *testing.T) {
    // ... 
}
func TestAbs(t *testing.T) {
    got := Abs(-1)
    if got != 1 {
        t.Errorf("Abs(-1) = %d; want 1", got)
    }
}

testes de benchmark!

// Rodamos com $ go test -bench .
// testes de benchmark!
func BenchmarkXxx(b *testing.B) {
    // ...
}
func BenchmarkHello(b *testing.B) {
    for i := 0; i < b.N; i++ {
        fmt.Sprintf("hello")
    }
}
// output:
// BenchmarkHello    10000000    282 ns/op
// rodou 10.000.000 vezes
// 282 ns por loop
func BenchmarkHello(b *testing.B) {
    for i := 0; i < b.N; i++ {
        fmt.Sprintf("hello")
    }
}
// durante a execução, b.N é ajustado 
// automaticamente para medição confiável
// de tempo

Lightweight built-in

profiling tool

com pprof (remotamente também através de um server HTTP!)

$ # profile usando go test
$ 
$ go test -cpuprofile cpu.prof -bench .
$ go test -memprofile mem.prof -bench .
$ 
$ # gera arquivos que podem ser lidos
$ # com `go tool pprof cpu.prof`, por ex

Podemos gerar SVGs e PNGs dos profiles

// profile com controle em código
pprof.StartCPUProfile()
// ...
pprof.StopCPUProfile()

built-in

race detection com -race

$ # output de exemplo
$ go test -race

==================
WARNING: DATA RACE
Read by goroutine 5:
  main.func·001()
     race.go:14 +0x169

Padronização de código com

go fmt

$ # formata um arquivo
$ # (-w não printa arquivo pra stdout)
$ gofmt -w yourcode.go

$ # formata um package inteiro
$ # ("go fmt" roda "gofmt" no package)
$ go fmt path/to/your/package

$ # diff preview de mudanças
$ gofmt -d path-to-code

Mais de 70% do código encontrado "in the wild" segue o padrão gofmt

Fonte: Pesquisa realizada pela Golang Team, encontado em https://blog.golang.org/go-fmt-your-code

Features

Tipagem forte e estática sem conversões implícitas, mas com ajuda sintática

Mais segurança de tipagem que Java (que tem conversões implícitas)

Ou seja

Leitura flui como Python (que tem variáveis sem tipo)

Ou seja

Interfaces permitem polimorfismo durante runtime

Concorrência é parte integral da linguagem, sendo explorada através goroutines e channels

Rob Pike - Concurrency is Not Parallelism

Generics estão por vir ainda

(ver draft para Go 2.0!)


https://go.googlesource.com/proposal/+/master/design/go2draft-contracts.md

Falando em Go 2.0...

 

Em Agosto de 2019 se inicia o Go 1.4 cycle

Ao início de Novembro de 2019, as proposals que passarem pelo período de aprovação continuarão

Transparência de Código

Pacotes importados e não utilizados não deixam o projeto compilar

Circular Dependencies são identificadas em tempo de compilação e não compilam

Expectativas de retrocompatibilidade de código (não de binário) bem definidas

 

https://golang.org/doc/go1compat

Difícil repetir o sufoco de Python2/Python3, por exemplo

Performance

 

Single Standalone Binary

 

 

Single Standalone Binary

  • Sem libs dinâmicas (CGO disabled)

  • Sem virtual machines
  • Binário contém todo o runtime necessário (e gc!)

Garbage Collection

 

  • Baixa latência
  • Em constante evolução

Garbage Collection

Latência de ~300ms (stop the world) (Aug 2015)

6 meses depois, latência baixou para 40ms  (Mar 2016)

6 meses depois, latência baixou para ~3ms  (Aug 2016)

12 meses depois, latência baixou para ~0.5ms  (Aug 2017)

Todas contagens levando em consideração um heap de 18GB

Tamanho de binário

Hello World - ~2MB

Contém todo o runtime & GC

 

uname -a Linux 5.2.3-arch1-1-ARCH

go version go1.12.7 linux/amd64

 

Microsserviço em produção dockerizado - ~12.6MB

 

Docker image gcr.io/distroless/static

Go não é perfeito, e nem foi feito com este intuito

No entanto, não podemos negar que Go é uma ótima opção para se ter na sua caixinha de ferramentas

Go will be the server language of the future.” — Tobias Lütke, Shopify

Thank you

Why Go

By Natan Streppel

Why Go

  • 202