Natan Streppel
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
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 tempoLightweight 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 exPodemos 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-codeMais 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
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)
Leitura flui como Python (que tem variáveis sem tipo)
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
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
Single Standalone Binary
Single Standalone Binary
Sem libs dinâmicas (CGO disabled)
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
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