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

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