Escolar Documentos
Profissional Documentos
Cultura Documentos
David Robert
davidrobert@gmail.com
David Robert
davidrobert@gmail.com
linkedin.com/in/davidrobert
Go uma linguagem de
programao open source
que faz com que seja fcil
construir software simples,
confivel, e eficiente
https://golang.org
tem grandes, grandes
problemas!
Quais (grandes) problemas?
Builds lentos
Dependncias no controladas
Custo de updates
Dificuldade para automatizar tarefas
Builds entre vrias linguagens de programao
Cdigo difcil de compreender
''
No geral, o desenvolvimento no
grande, lento, e muitas vezes
''
desajeitado. Mas efetivo
https://talks.golang.org/2012/splash.article
Ken Thompson (B, C, Unix, UTF-8)
Rob Pike (Unix, UTF-8)
Robert Griesemer (Hotspot, JVM)
e muitos outros engenheiros do Google
Histria
https://golang.org/doc/faq#history
Histria
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
Histrico de Verses
Go 1 Go 1.4
Go 1.3
Go 1.2 Go 1.5
Go 1.1
https://golang.org/project/
Google Trends "golang"
Por que usar Go?
Eliminar lentido
Melhorar a eficacia
Aumentar a produtividade
Manuteno escalvel
http://benchmarksgame.alioth.debian.org
Go contm um conjunto de ferramentas
para gerir cdigo fonte...
Principais ferramentas:
build compila pacotes e dependencias
run compila e executa programas Go
clean remove arquivos objeto
env imprime informaes do ambiente
test testa pacotes e benchmarks
Outras ferramentas:
fix, fmt, get, install, list, tool,
version, vet.
Mas quem usa Go ?
https://github.com/golang/go/wiki/GoUsers
O que voc vai ver em Go
Compilado
Memoria gerenciada (garbage-collected)
Tem seu prprio runtime
Sintaxe simples
Excelente biblioteca padro
Multi plataforma
Orientao a Objetos
Estaticamente e fortemente tipado
Concorrncia (goroutines)
Dependncias explicitas
Retorno multi valorado
Ponteiros
e mais...
O que voc no vai
ver em Go
Tratamento de excees
Herana
Generics
Assert
Sobrecarga de mtodos
$ go run packages.go
My favorite number is 1
Variavis
A instruo var declara uma lista de variavis
O tipo informado no fim
A instruo var pode incluir inicializao, 1 por variavl. Neste
caso, o tipo pode ser omitido porque ser inferido
$ go run short-variable-declarations.go
1 2 3 true false no!
Constantes
Constantes so declaradas com a keyword const
No possvel usar :=
$ go run constants.go
Hello world! Happy 3.14 Day! Go rules?
true
Funes
Funes podem ter argumentos
O tipo fica aps o nome do argumento
$ go run functions.go
55
Retorno de valores mltiplos
Uma funo pode ter mltiplos retornos
$ go run multiple-results.go
world hello
Lao For
A nica estrutura do lao que o Go tem for
Muito similar com Java ou C, exceto pelos ( )
A parte inicial e final da declarao podem estar vazias
Inicializao de estruturas
retangulo{10, 20}
retangulo{largura: 10, altura: 20}
Orientao a Objetos
Construtores
package vingadores
func main() {
capitao := vingadores.NewVingador("Capito Amrica")
fmt.Println(capitao.nome)
}
Orientao a Objetos
Construtores Depois de importar um pacote, voc pode
consultar os nomes que exporta
package vingadores
Um nome exportado se comea com
type vingador struct { uma LETRA MAISCULA
nome string
}
func NewVingador(nome string) *vingador {
v := new(vingador)
v.nome = nome
return v
}
func main() {
capitao := vingadores.NewVingador("Capito Amrica")
fmt.Println(capitao.nome)
}
Orientao a Objetos
struct.go
1 package main
2
3 import "fmt"
4
5 type pessoa struct {
6 nome string
7 idade int
8 }
9
10 func main() {
11 fmt.Println(pessoa{"Homem de Ferro", 40})
12 fmt.Println(pessoa{nome: "Thor", idade: 100})
13
14 s := pessoa{nome: "Hulk", idade: 45}
15 fmt.Println(s.nome)
16
17 s.idade = 42
18 fmt.Println(s.idade)
19 }
Orientao a Objetos
struct.go
1 package main
2
3 import "fmt" $ go run struct.go
4 {Homem de Ferro 40}
5 type pessoa struct { {Thor 100}
6 nome string
7 idade int Hulk
8 }
9 42
10 func main() {
11 fmt.Println(pessoa{"Homem de Ferro", 40})
12 fmt.Println(pessoa{nome: "Thor", idade: 100})
13
14 s := pessoa{nome: "Hulk", idade: 45}
15 fmt.Println(s.nome)
16
17 s.idade = 51
18 fmt.Println(s.idade)
19 }
Orientao a Objetos
methods.go
1 package main
2 import "fmt"
3
4 type retangulo struct {
5 largura, altura int
6 }
7 func (r retangulo) area() int {
8 return r.largura * r.altura
9 }
10
11 func (r retangulo) perimetro() int {
12 return 2 * r.largura + 2 * r.altura
13 }
14 func main() {
15 r := retangulo{largura: 10, altura: 5}
16
17 fmt.Println("area: ", r.area())
18 fmt.Println("perim:", r.perimetro())
19 }
Orientao a Objetos
methods.go
1 package main
2 import "fmt"
3 $ go run methods.go
4 type retangulo struct { area: 50
5 largura, altura int perim: 30
6 }
7 func (r retangulo) area() int {
8 return r.largura * r.altura
9 }
10
11 func (r retangulo) perimetro() int {
12 return 2 * r.largura + 2 * r.altura
13 }
14 func main() {
15 r := retangulo{largura: 10, altura: 5}
16
17 fmt.Println("area: ", r.area())
18 fmt.Println("perim:", r.perimetro())
19 }
HERANA
HERANA
Como assim
no tem
herana !?
Herana
Quebra de encapsulamento
Herana
Go no tem Herana !
Herana
Go no tem Herana !
1 package main
2 import "fmt"
3 type Cozinha struct {
4 lampadas int
5 }
6
7
8
9 type Casa struct {
10 Cozinha
11
12 }
13
14
15
16 func main() {
17 c := Casa{Cozinha{2}}
18 fmt.Println("A casa tem ", c.lampadas , " lampadas")
19 }
Herana (anonymous field)
anonymous-field.go
1 package main
2 import "fmt"
3 type Cozinha struct { $ go run anonymous-field.go
4 lampadas int A casa tem 2 lampadas
5 }
6
7
8
9 type Casa struct {
10 Cozinha
11
12 }
13
14
15
16 func main() {
17 c := Casa{Cozinha{2}}
18 fmt.Println("A casa tem ", c.lampadas , " lampadas")
19 }
Herana (anonymous field)
anonymous-field.go
1 package main
2 import "fmt"
3 type Cozinha struct {
4 lampadas int
5 }
6 type Quarto struct {
7 lampadas int
8 }
9 type Casa struct {
10 Cozinha
11 Quarto
12 }
13
14
15
16 func main() {
17 c := Casa{Cozinha{2}, Quarto{3}}
18 fmt.Println("A casa tem ", c.lampadas , " lampadas")
19 }
Herana (anonymous field)
anonymous-field.go
1 package main
2 import "fmt"
3 type Cozinha struct { $ go run anonymous-field.go
4 lampadas int ambiguous selector c.lampadas
5 }
6 type Quarto struct {
7 lampadas int
8 }
9 type Casa struct {
10 Cozinha
11 Quarto
12 }
13
14
15
16 func main() {
17 c := Casa{Cozinha{2}, Quarto{3}}
18 fmt.Println("A casa tem ", c.lampadas , " lampadas")
19 }
Herana (anonymous field)
anonymous-field.go
1 package main
2 import "fmt"
3 type Cozinha struct {
4 lampadas int
5 }
6 type Quarto struct {
7 lampadas int
8 }
9 type Casa struct {
10 Cozinha
11 Quarto
12 }
13 func (c Casa) lampadas() int {
14 return c.Cozinha.lampadas + c.Quarto.lampadas
15 }
16 func main() {
17 c := Casa{Cozinha{2}, Quarto{3}}
18 fmt.Println("A casa tem ", c.lampadas(), " lampadas")
19 }
Herana (anonymous field)
anonymous-field.go
1 package main
2 import "fmt"
3 type Cozinha struct { $ go run anonymous-field.go
4 lampadas int A casa tem 5 lampadas
5 }
6 type Quarto struct {
7 lampadas int
8 }
9 type Casa struct {
10 Cozinha
11 Quarto
12 }
13 func (c Casa) lampadas() int {
14 return c.Cozinha.lampadas + c.Quarto.lampadas
15 }
16 func main() {
17 c := Casa{Cozinha{2}, Quarto{3}}
18 fmt.Println("A casa tem ", c.lampadas(), " lampadas")
19 }
Go
Tratando Erros
http://blog.golang.org/error-handling-and-go
Tratamento de Erros
Estados inconsistentes ou anormais so indicados atravs
do error. Por exemplo a funo os.Open
Assinatura da funo:
func Open(name string) (file *File, err error)
if f < 0 {
return 0, fmt.Errof("negative number %g", f)
}
Customizando seus erros
possvel criar suas prprias implementaes de erros.
Multicore
Networks
Cloud Computing
Grande quantidade de usurios.
Go suporta concorrncia
Procedimentos concorrentes
Mais paralelismo
Oito Gophers totalmente ocupados
Concorrncia versus Paralelismo
Otimizao total
Usando todas as tcnicas, dezesseis Gopher esto
trabalhando
Concorrncia versus Paralelismo
http://www.goinggo.net/2014/02/the-nature-of-channels-in-go.html
Buffered Channels
Por padro canais so no buferizados. S aceitaro
envios se houver um receptor pronto para receber o
valor
http://www.goinggo.net/2014/02/the-nature-of-channels-in-go.html
Concorrncia em Go
Para executar uma goroutine: go
https://www.quora.com/How-does-the-Go-runtime-work
http://www.cs.columbia.edu/~aho/cs6998/reports/12-12-11_DeshpandeSponslerWeiss_GO.pdf
http://blog.altoros.com/golang-internals-part-5-runtime-bootstrap-process.html
Go Runtime
S isso ou tem mais?
Pointer
Struct
Matrix
Slice
Range
Map
Value function
Closures
Method
Interface
Stringer
Error
e muito mais!!!
http://go-tour-br.appspot.com
Servidor Web
Um servidor web com menos de 15 lines!!
$ go run http.go
Now you are ready to
!
Perguntas?
Obrigado!
David Robert
davidrobert@gmail.com
Bibliografia
http://golang.org
http://go-tour-br.appspot.com/
https://tour.golang.org
http://www.golangbr.org/
https://vimeo.com/49718712
http://talks.golang.org/2012/waza.slide
http://gophercon.com
http://www.infoq.com/br/news/2014/09/go-1-3
http://www.casadocodigo.com.br/products/livro-google-go
http://www.grokpodcast.com/series/a-linguagem-go/
https://pt.wikipedia.org/wiki/Go_(linguagem_de_programao)
https://gobyexample.com
http://goporexemplo.golangbr.org/
http://www.goinggo.net/2014/02/the-nature-of-channels-in-go.html
http://www.goinggo.net/2013/09/detecting-race-conditions-with-go.html
http://golangtutorials.blogspot.com.br/2011/06/inheritance-and-subclassing-in-go-or.html
http://golangtutorials.blogspot.com.br/2011/06/anonymous-fields-in-structs-like-object.html
http://commandcenter.blogspot.ca/2012/06/less-is-exponentially-more.html
http://www.toptal.com/go/go-programming-a-step-by-step-introductory-tutorial
http://www.slideshare.net/while42/programando-em-Go
Estamos contratando
jobs@elo7.com