Introdução a Go
Introdução a Go para programação paralela
MO644 — Programação Paralela
Alexandre Medeiros
alexandre.n.medeiros@gmail.com
Instituto de Computação Universidade Estadual de Campinas
Introdução a Go
Estes slides e os códigos usados na apresentação podem ser encontrados na minha página!
Introdução a Go Introdução
O que é Go?
Golang
Go, ou Golang, é uma linguagem de programação Open Source onde é fácil fazer programas simples, confiáveis e eficientes.
Introdução a Go Introdução
O que é Go?
Criadores
A linguagem foi desenvolvida por Robert Griesemer, Rob Pike e Ken Thompson no Google.
Introdução a Go Introdução
Principais ideias
Compilação rápida Execução rápida Simples de se programarIntrodução a Go Introdução
Principais ideias
Compilação rápida Execução rápida Simples de se programarIntrodução a Go Introdução
Principais ideias
Compilação rápida Execução rápida Simples de se programarIntrodução a Go Introdução Funcionalidades
Funcionalidades interessantes
Sintaxe inspirada em C Garbage-collectedIntrodução a Go Introdução Funcionalidades
Funcionalidades interessantes
Sintaxe inspirada em C Garbage-collectedIntrodução a Go Introdução Funcionalidades
Funcionalidades interessantes
Sintaxe inspirada em C Garbage-collectedIntrodução a Go Introdução
Funcionalidades
E mais importante!
Introdução a Go Introdução
Funcionalidades
E mais importante!
Introdução a Go Hands-on!
Exemplos
Introdução a Go Hands-on!
Hello, World!
p a c k a g e main i m p o r t " f m t " f u n c main () { fmt . P r i n t l n (" H e l l o , W o r l d ! " ) } Programa 1: hello.go $ go run hello.go Hello , W o r l d !Introdução a Go Hands-on!
goroutines
goroutines
Introdução a Go Hands-on! goroutines
goroutines
f u n c say ( s s t r i n g ) { f o r i := 0; i < 3; i ++ { t i m e . S l e e p ( 1 0 0 * t i m e . M i l l i s e c o n d ) fmt . P r i n t l n ( s ) } } f u n c main () { go say ( " W o r l d " ) say (" H e l l o " ) } Programa 2: goroutine.goIntrodução a Go Hands-on! goroutines
goroutines
$ go run goroutine.go W o r l d H e l l o W o r l d H e l l o W o r l d H e l l oIntrodução a Go Hands-on!
channels
Canais de comunicação
Os channels são a principal maneira de comunicação e sincronização entre goroutines.
Introdução a Go Hands-on!
channels
Canais de comunicação
f u n c say ( s s t r i n g , done chan b o o l ) { f o r i := 0; i < 3; i ++ { t i m e . S l e e p ( 1 0 0 * t i m e . M i l l i s e c o n d ) fmt . P r i n t l n ( s ) } d o n e < - t r u e } f u n c main () { d o n e := make( chan b o o l ) go say ( " H e l l o , W o r l d ! " , done ) i f < - d o n e { fmt . P r i n t l n (" D o n e : ) " ) } } Programa 3: channels.go
Introdução a Go Hands-on! channels
Canais de comunicação
$ go run channels.go Hello , W o r l d ! Hello , W o r l d ! Hello , W o r l d ! D o n e :)Introdução a Go Hands-on!
buffered channels
Comunicação não bloqueante
Para que a goroutine não fique bloqueada na hora de enviar dados, é possível criar um canal com um buffer.
Introdução a Go Hands-on!
buffered channels
Comunicação não bloqueante
f u n c produce ( id , n i n t , ch chan < - i n t ) { f o r i := 0; i < n ; i ++ { val := i * id ch < - val fmt . P r i n t l n ( id , " p r o d u c e d " , val ) } } f u n c main () { ch := make( chan i n t , 2) go produce (42 , 4 , ch ) t i m e . S l e e p ( 1 0 0 * t i m e . M i l l i s e c o n d ) f o r i := 0; i < 4; i ++ { val := < - ch fmt . P r i n t l n (" E l e m e n t " , i , " i s " , val ) } } Programa 4: buffered-channels.go
Introdução a Go Hands-on!
buffered channels
Comunicação não bloqueante
$ go run buffered-channels.go 42 p r o d u c e d 0 42 p r o d u c e d 42 E l e m e n t 0 is 0 E l e m e n t 1 is 42 E l e m e n t 2 is 84 42 p r o d u c e d 84 42 p r o d u c e d 126 E l e m e n t 3 is 126
Introdução a Go Hands-on!
select
Múltiplos canais
O select é similar a um switch-case, sua função é receber ou enviar dados com múltiplos canais.
Introdução a Go Hands-on! select
Múltiplos canais
f u n c main () { ch1 := make( chan i n t , 2) ch2 := make( chan i n t , 2) go produce (1 , 4 , ch1 ) go produce (2 , 4 , ch2 ) f o r i := 0; i < 8; i ++ { s e l e c t { c a s e val := <- ch1 : fmt . P r i n t l n (" F r o m 1 : " , val ) c a s e val := <- ch2 : fmt . P r i n t l n (" F r o m 2 : " , val ) } } } Programa 5: select.goIntrodução a Go Hands-on! select
Múltiplos canais
$ go run select.go P r o d u c e r 2 : 0 P r o d u c e r 1 : 0 P r o d u c e r 2 : 2 P r o d u c e r 1 : 1 P r o d u c e r 1 : 2 F r o m 1: 0 F r o m 1: 1 P r o d u c e r 1 : 3 P r o d u c e r 2 : 4 F r o m 2: 0 F r o m 1: 2 F r o m 2: 2 F r o m 2: 4 F r o m 2: 6 P r o d u c e r 2 : 6 F r o m 1: 3Introdução a Go Hands-on!
range
for-each
Introdução a Go Hands-on! range
for-each
f u n c main () { a := [5]i n t {1 , 2 , 3 , 4 , 5} f o r i , x := r a n g e a { fmt . P r i n t l n (" E l e m e n t " , i , " i s " , x ) } } Programa 6: range.goIntrodução a Go Hands-on! range
for-each
$ go run range.go E l e m e n t 0 is 1 E l e m e n t 1 is 2 E l e m e n t 2 is 3 E l e m e n t 3 is 4 E l e m e n t 4 is 5Introdução a Go Hands-on!
rangeover channels
for-each em um canal
Introdução a Go Hands-on!
rangeover channels
for-each em um canal
f u n c produce ( id , n i n t , ch chan < - i n t ) { f o r i := 0; i < n ; i ++ { val := i * id ch < - val fmt . P r i n t l n ( id , " p r o d u c e d " , val ) } c l o s e ( ch ) } f u n c main () { ch := make( chan i n t , 2) go produce (42 , 4 , ch ) f o r val := r a n g e ch { fmt . P r i n t l n (" E l e m e n t i s " , val ) } } Programa 7: range-channel.goIntrodução a Go Hands-on!
rangeover channels
for-each em um canal
$ go run range-channel.go 42 p r o d u c e d 0 E l e m e n t is 0 42 p r o d u c e d 42 E l e m e n t is 42 42 p r o d u c e d 84 E l e m e n t is 84 42 p r o d u c e d 126 E l e m e n t is 126Introdução a Go E ainda tem mais
Ferramentas
Conjunto de ferramentas completo
go build
go run gofmt godoc go get
Introdução a Go E ainda tem mais
Ferramentas
Conjunto de ferramentas completo
go build go run
gofmt godoc go get
Introdução a Go E ainda tem mais
Ferramentas
Conjunto de ferramentas completo
go build go run gofmt
godoc go get
Introdução a Go E ainda tem mais
Ferramentas
Conjunto de ferramentas completo
go build go run gofmt godoc
Introdução a Go E ainda tem mais
Ferramentas
Conjunto de ferramentas completo
go build go run gofmt godoc go get
Introdução a Go E ainda tem mais
Links úteis
Referências
tour.golang.org gobyexample.com
Introdução a Go E ainda tem mais
Links úteis
Divirta-se você também!
Introdução a Go That’s all folks
Introdução a Go That’s all folks