20
Go, Goroutines e o Gopher Alexandre Vicenzi

Go, goroutines e o gopher

Embed Size (px)

Citation preview

Go, Goroutines e o GopherAlexandre Vicenzi

O que é Go?Go é uma linguagem de programação desenvolvida pela Google para ajudar a resolver problemas do Google.

Origem● 2007 - 2009● Google● Robert Griesemer, Rob Pike e Ken Thompson

Proposta● Concorrente● Compilar rapidamente● Garbage Collector● Estaticamente tipada

Quem está usando?

Hello World

import “fmt”

func main() {

fmt.Println(“Olá mundo!”)

}

Diferenciais● Orientação a Objetos sem herança● Sem exceções● Imports e variáveis não usadas causam erro de compilação● Sem method overloading ou parâmetros opcionais● Visibilidade é definida pela primeira letra● Interfaces sem declaração (duck typing)

Sem exceçõesimport ( "os" "log")

file, err := os.Open("file.txt")

if err != nil { log.Fatal(err)}

Duck typingEm linguagens dinâmicas como Python existem o conceito de Duck Typing.

"if it looks like a duck and quacks like a duck, it’s a duck."

class Duck: def quack(self): print("quack")

class Cow: def quack(self): print("muu")

def say_quack(quacker) quacker.quack()

say_quack(Duck())say_quack(Cow())

Duck Typing em Go

type Duck struct {}

func (d *Duck) Quack() { fmt.Println("Quack")}

func SayQuack(q Quacker) { q.Quack()}

SayQuack(&Duck{})SayQuack(&Cow{})

type Cow struct {}

func (c *Cow) Quack() { fmt.Println("Muu")}

type Quacker interface { func Quack()}

Concorrência● Goroutines● Channels

Goroutines● Função que executa concorrentemente● São basicamente threads● Basta adicionar a keyword go na chamada do método● Muito similar ao comando & do shell, executa e termina silenciosamente

Goroutinesfunc f(from string) {

for i := 0; i < 3; i++ {

fmt.Println(from, ":", i)

}

}

func main() {

f("direct")

go f("goroutine")

go func(msg string) {

fmt.Println(msg)

}("going")

var input string

fmt.Scanln(&input)

fmt.Println("done")

}

$ go run goroutines.godirect : 0direct : 1direct : 2goroutine : 0goinggoroutine : 1goroutine : 2<enter>done

Channels● São pipes que conectam goroutines● Simples para trocar mensagens entre goroutines● Unbuffered e síncrono por padrão● O sender fica bloqueado até o receiver receber o valor● Buffered channels bloqueiam apenas se o buffer ficar cheio

Channelspackage main

import "fmt"

func main() {

messages := make(chan string)

go func() { messages <- "ping" }()

msg := <-messages

fmt.Println(msg)

}

$ go run channels.go ping

E mais● Ponteiros● Pacotes● Defer, Panic e Recover● Testes● Controle de dependências● C? Go? Cgo!

E o Gopher?Você já conheceu ele :)

● Desenhado por Renée French● Inspirado no gopher de uma promoçao de camisa da rádio WFMU

Dúvidas?

Referências● The Go Programming Language● Go by Example● An Introduction to Programming in Go

Obrigado

@alxvicenzi

alexandrevicenzi.com

github.com/alexandrevicenzi