A linguagem de programação GoFrancisco SouzaDev in Cachu 2013
program mainprint *, "Hello world!"end program
what the f**rancisco?!open source fanboyDesenvolvedor na Globo.comUsa Go diaramente para construir o Tsurutsuru.io(http://...
Go?Uma linguagem focada em algumas características...EficiênciaSegurançaConcorrênciaEscalabilidadeUm mascote legal :)
Por que uma nova linguagem?
Linguagens estáticas
package mainimport "fmt"func main() {fmt.Println("#devincachu 2013: eu fui! :D")} Run
Tempo de compilação...Tsuru: 16 mil linhas de código% time go install ./...2.53 real 3.03 user 0.56 sysCompilador + biblio...
Tempo de compilação (cont.)
Linguagens dinâmicas
Go: o melhor dos dois mundos?
Explorando a biblioteca padrão...package mainimport ("fmt""net")func main() {listen, err := net.Listen("tcp", "127.0.0.1:3...
Um pouco mais amigável...127.0.0.1:7070/(http://127.0.0.1:7070/)package mainimport ("fmt""net/http")func main() {http.Hand...
Aspectos da linguagem
VariáveisMuitos jeitos de declarar, alguns mais verbosos, outros mais simples...var name stringname = "Francisco"fmt.Print...
DeclaraçõesNa linguagem C e maioria de suas derivadas, declarações podem ser lidas emespiral:Detalhes:The Clockwise/Spiral...
Declarações (cont.)Em Go, as declarações são sempre da esquerda para a direita:var name stringvar name string = "Francisco...
Loopsfor i := 0; i < 10; i++ {fmt.Println(i)}for {fmt.Println("Looping forever")break // not really}
Slices & arraysEm Go, arrays são como os arrays estáticos em C:var numeros [16]intAlém dos arrays, existem os slices:var n...
Slices: exemplofunc Reverse(values []int) []int {result := make([]int, len(values))length := len(values)for i := range val...
Funçõesfunc sum(x int, y int) int {return x + y}func swap(x, y int) (int, int) {return y, x}func split(sum int) (x, y int)...
Tipostype Person struct {Name stringBirth time.Time}type MyString stringtype MyInt intNo pacote :type Duration int64
"Construtores"Em Go, não existem construtores propriamente ditos, mas há uma convenção nacomunidade para construtores ( ):...
Métodostype Person struct {Name stringBirth time.Time}func (p *Person) Age() int {difference := time.Now().Sub(p.Birth)ret...
Métodos (cont.)type MyInt intfunc (i MyInt) String() string {return fmt.Sprintf("%d", i)}
Interfaces
InterfacesGo possui interfaces, de forma semelhante à linguagem Java.type Reader interface {Read(content []byte) (int, err...
Interfaces (cont.)Em , qualquer tipo que tenha o método especificado por uma interface,automaticamente implementa aquela i...
Tratamento de erros
Lidando com errosNo construtor do tipo , o segundo retorno é do tipo .func NewPerson(name string, birth time.Time) (*Perso...
Lidando com erros (cont.)Go não inclui o mecanismo de exceções de linguagens como Python e Java. Aoinvés disso, a linguage...
Concorrência
CSPO modelo de concorrência é inspirado no CSP (Communicating Sequential Processes).PROC producer (CHAN INT out!)out ! 42:...
CSP (cont.)O modelo também inspirou outras linguagens, como Occam, Erlang e Limbo.O modelo também está disponível em outra...
CSP em GoProcessos -> goroutinesCanais -> canais :-)
GoroutinesA criação de uma goroutine é uma simples chamada de função precedida pelapalavra-chave go.package mainimport "fm...
CanaisEm Go, diferentes goroutines se comunicam através de canais.func sum(values []int, result chan int) {var sum intfor ...
Um exemplofunc elevator(people chan string) {for person := range people {fmt.Printf("Carrying %s...n", person)time.Sleep(t...
Concorrência vs Paralelismo
Concorrência vs ParalelismoConcorrência: lidar com múltiplas coisas ao mesmo tempoParalelismo: fazer múltiplas coisas ao m...
Hands on
Download de arquivosO exemplo visa demonstrar um client que baixa arquivos do site textfiles.com.
Download de arquivos (cont.)Uso do programa:% ./download -h-d="": Destination directory (where to save files)-u="": URL to...
SoluçãoCada worker é uma goroutine, que receberá um canal de arquivos para baixar.func download(files <-chan string, wg *s...
Solução (cont.)Os workers receberão os arquivos a partir de um canal. Haverá umenviando os links através desse canal.func ...
Declaração das flagsGo tem um pacote na biblioteca padrão para declaração de flags a seremutilizadas na linha de comando.v...
Extratorfunc extract(url string, files chan<- string) error {resp, err := http.Get(url)if err != nil {return err}defer res...
Workerfunc download(files <-chan string, wg *sync.WaitGroup) {defer wg.Done()for file := range files {resp, err := http.Ge...
Juntando todo mundofunc main() {flag.Parse()os.MkdirAll(dstdir, 0755)var wg sync.WaitGroupif workers < 1 {workers = 2}file...
Demonstração
Próximos passosSite da linguagemgolang.org(http://golang.org)A Tour of Gotour.golang.org(http://tour.golang.org)Effective ...
Thank youFrancisco SouzaDev in Cachu 2013@franciscosouza(http://twitter.com/franciscosouza)f@souza.cc(mailto:f@souza.cc)ht...
A Linguagem de Programação Go
A Linguagem de Programação Go
A Linguagem de Programação Go
Upcoming SlideShare
Loading in …5
×

A Linguagem de Programação Go

2,710 views

Published on

Palestra "A Linguagem de Programação Go", apresentada no Dev in Cachu 2013, no dia 04 de maio de 2013.

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,710
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
37
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

A Linguagem de Programação Go

  1. 1. A linguagem de programação GoFrancisco SouzaDev in Cachu 2013
  2. 2. program mainprint *, "Hello world!"end program
  3. 3. what the f**rancisco?!open source fanboyDesenvolvedor na Globo.comUsa Go diaramente para construir o Tsurutsuru.io(http://tsuru.io)
  4. 4. Go?Uma linguagem focada em algumas características...EficiênciaSegurançaConcorrênciaEscalabilidadeUm mascote legal :)
  5. 5. Por que uma nova linguagem?
  6. 6. Linguagens estáticas
  7. 7. package mainimport "fmt"func main() {fmt.Println("#devincachu 2013: eu fui! :D")} Run
  8. 8. Tempo de compilação...Tsuru: 16 mil linhas de código% time go install ./...2.53 real 3.03 user 0.56 sysCompilador + biblioteca padrão: 230++ mil linhas de código% time ./make.bash47.89 real 59.23 user 11.54 sys
  9. 9. Tempo de compilação (cont.)
  10. 10. Linguagens dinâmicas
  11. 11. Go: o melhor dos dois mundos?
  12. 12. Explorando a biblioteca padrão...package mainimport ("fmt""net")func main() {listen, err := net.Listen("tcp", "127.0.0.1:3000")if err != nil {panic(err)}defer listen.Close()for {conn, err := listen.Accept()if err != nil {panic(err)}fmt.Fprintln(conn, "Oi pessoal do #devincachu!")conn.Close()}} Run
  13. 13. Um pouco mais amigável...127.0.0.1:7070/(http://127.0.0.1:7070/)package mainimport ("fmt""net/http")func main() {http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, "Oi do #devincachu 2013! :)")})http.ListenAndServe("127.0.0.1:7070", nil)} Run
  14. 14. Aspectos da linguagem
  15. 15. VariáveisMuitos jeitos de declarar, alguns mais verbosos, outros mais simples...var name stringname = "Francisco"fmt.Println(name)var name string = "Francisco"fmt.Println(name)var name = "Francisco"fmt.Println(name)name := "Francisco"fmt.Println(name)
  16. 16. DeclaraçõesNa linguagem C e maioria de suas derivadas, declarações podem ser lidas emespiral:Detalhes:The Clockwise/Spiral Rule(http://c-faq.com/decl/spiral.anderson.html)
  17. 17. Declarações (cont.)Em Go, as declarações são sempre da esquerda para a direita:var name stringvar name string = "Francisco"var name = "Francisco"name := "Francisco"var f func(fn func(int) int) func(int) int
  18. 18. Loopsfor i := 0; i < 10; i++ {fmt.Println(i)}for {fmt.Println("Looping forever")break // not really}
  19. 19. Slices & arraysEm Go, arrays são como os arrays estáticos em C:var numeros [16]intAlém dos arrays, existem os slices:var numeros []int
  20. 20. Slices: exemplofunc Reverse(values []int) []int {result := make([]int, len(values))length := len(values)for i := range values {result[i] = values[length-1-i]}return result}func main() {numbers := [8]int{1, 2, 3, 4, 5, 6, 7, 8}fmt.Println(Reverse(numbers[:]))} Run
  21. 21. Funçõesfunc sum(x int, y int) int {return x + y}func swap(x, y int) (int, int) {return y, x}func split(sum int) (x, y int) {x = sum * 4 / 9y = sum - xreturn}fmt.Println(sum(10, 5))fmt.Println(swap(10, 5))fmt.Println(split(20)) Run
  22. 22. Tipostype Person struct {Name stringBirth time.Time}type MyString stringtype MyInt intNo pacote :type Duration int64
  23. 23. "Construtores"Em Go, não existem construtores propriamente ditos, mas há uma convenção nacomunidade para construtores ( ):func NewPerson(name string, birth time.Time) (*Person, error) {if time.Now().Sub(birth) < 0 {return nil, errors.New("LOLWUT, did you born in the future?!")}person := Person{Name: name, Birth: birth}return &person, nil}
  24. 24. Métodostype Person struct {Name stringBirth time.Time}func (p *Person) Age() int {difference := time.Now().Sub(p.Birth)return int(difference / (365 * 24 * time.Hour))}p, err := NewPerson("Francisco", date)if err != nil {panic(err)}fmt.Printf("%s is %d years old.n", p.Name, p.Age()) Run
  25. 25. Métodos (cont.)type MyInt intfunc (i MyInt) String() string {return fmt.Sprintf("%d", i)}
  26. 26. Interfaces
  27. 27. InterfacesGo possui interfaces, de forma semelhante à linguagem Java.type Reader interface {Read(content []byte) (int, error)}Você pode declarar funções baseadas nessas interfaces:func Dump(r Reader) {var buf [512]byten, _ := r.Read(buf[:])for n > 0 {fmt.Printf("%s", buf)n, _ = r.Read(buf[:])}}
  28. 28. Interfaces (cont.)Em , qualquer tipo que tenha o método especificado por uma interface,automaticamente implementa aquela interface, de forma implícita.Assim, qualquer tipo com o método implementa a interface declaradano slide anterior.resp, err := http.Get("http://golang.org/")if err != nil {panic(err)}Dump(resp.Body)file, err := os.Open("/etc/passwd")if err != nil {panic(err)}Dump(file)file.Close()
  29. 29. Tratamento de erros
  30. 30. Lidando com errosNo construtor do tipo , o segundo retorno é do tipo .func NewPerson(name string, birth time.Time) (*Person, error) {
  31. 31. Lidando com erros (cont.)Go não inclui o mecanismo de exceções de linguagens como Python e Java. Aoinvés disso, a linguagem utiliza o tipo para representar falhas.Um idioma comum:func fazAlgumaCoisa() (*Result, error)Tratando erros:result, err := fazAlgumaCoisa()if err != nil {panic(err)}Ignorando erros:result, _ := fazAlgumaCoisa()
  32. 32. Concorrência
  33. 33. CSPO modelo de concorrência é inspirado no CSP (Communicating Sequential Processes).PROC producer (CHAN INT out!)out ! 42:PROC consumer (CHAN INT in?)INT v:SEQin ? v:
  34. 34. CSP (cont.)O modelo também inspirou outras linguagens, como Occam, Erlang e Limbo.O modelo também está disponível em outras linguagens:python-csp(https://github.com/python-concurrency/python-csp)JCSP(http://www.cs.kent.ac.uk/projects/ofa/jcsp/)
  35. 35. CSP em GoProcessos -> goroutinesCanais -> canais :-)
  36. 36. GoroutinesA criação de uma goroutine é uma simples chamada de função precedida pelapalavra-chave go.package mainimport "fmt"func say(what, who string) {fmt.Printf("%s, %s!n", what, who)}func main() {say("Hello world", "#devincachu")} Run
  37. 37. CanaisEm Go, diferentes goroutines se comunicam através de canais.func sum(values []int, result chan int) {var sum intfor _, v := range values {sum += v}result <- sum}func main() {ch := make(chan int)values := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}go sum(values, ch)fmt.Println(<-ch)} Run
  38. 38. Um exemplofunc elevator(people chan string) {for person := range people {fmt.Printf("Carrying %s...n", person)time.Sleep(time.Duration(rand.Intn(2000)) * time.Millisecond)}}ch := make(chan string)go elevator(ch)for _, p := range people {ch <- p} Run
  39. 39. Concorrência vs Paralelismo
  40. 40. Concorrência vs ParalelismoConcorrência: lidar com múltiplas coisas ao mesmo tempoParalelismo: fazer múltiplas coisas ao mesmo tempofunc elevator(people chan string) {for person := range people {fmt.Printf("Carrying %s...n", person)time.Sleep(time.Duration(rand.Intn(2000)) * time.Millisecond)}}ch := make(chan string)go elevator(ch)for _, p := range people {ch <- p} Run
  41. 41. Hands on
  42. 42. Download de arquivosO exemplo visa demonstrar um client que baixa arquivos do site textfiles.com.
  43. 43. Download de arquivos (cont.)Uso do programa:% ./download -h-d="": Destination directory (where to save files)-u="": URL to download files from-w=2: Number of workersExemplo de uso:% ./download -d files -u http://www.textfiles.com/programming/ -w 50
  44. 44. SoluçãoCada worker é uma goroutine, que receberá um canal de arquivos para baixar.func download(files <-chan string, wg *sync.WaitGroup) {O é um mecanismo de sincronização que permitirá esperar até que oworker termine a execução.
  45. 45. Solução (cont.)Os workers receberão os arquivos a partir de um canal. Haverá umenviando os links através desse canal.func extract(url string, files chan<- string) error {O extrator utilizará uma expressão regular para extrair os arquivos.var link = regexp.MustCompile(`<a href="([w-]+.txt)">[w-]+.txt</a>`)
  46. 46. Declaração das flagsGo tem um pacote na biblioteca padrão para declaração de flags a seremutilizadas na linha de comando.var url, dstdir stringvar workers uintfunc init() {flag.StringVar(&url, "u", "", "URL to download files from")flag.StringVar(&dstdir, "d", "", "Destination directory (where to save files)")flag.UintVar(&workers, "w", 2, "Number of workers")}A função init é executada sempre que o pacote é importado. No caso do pacotemain, a função é executada antes da função .
  47. 47. Extratorfunc extract(url string, files chan<- string) error {resp, err := http.Get(url)if err != nil {return err}defer resp.Body.Close()b, err := ioutil.ReadAll(resp.Body)if err != nil {return err}links := link.FindAllSubmatch(bytes.ToLower(b), -1)for _, l := range links {files <- string(l[1])}close(files)return nil}
  48. 48. Workerfunc download(files <-chan string, wg *sync.WaitGroup) {defer wg.Done()for file := range files {resp, err := http.Get(url + file)if err != nil {log.Printf("Failed to download %q: %s.", file, err)continue}p := path.Join(dstdir, file)f, err := os.Create(p)if err != nil {log.Printf("Failed to open %q: %s.", p, err)continue}_, err = io.Copy(f, resp.Body)resp.Body.Close()f.Close()if err != nil {log.Printf("Failed to write %q: %s.", p, err)}}}
  49. 49. Juntando todo mundofunc main() {flag.Parse()os.MkdirAll(dstdir, 0755)var wg sync.WaitGroupif workers < 1 {workers = 2}files := make(chan string, workers)for i := uint(0); i < workers; i++ {wg.Add(1)go download(files, &wg)}err := extract(url, files)if err != nil {log.Fatal(err)}wg.Wait()}
  50. 50. Demonstração
  51. 51. Próximos passosSite da linguagemgolang.org(http://golang.org)A Tour of Gotour.golang.org(http://tour.golang.org)Effective Gogolang.org/doc/effective_go.html(http://golang.org/doc/effective_go.html)Communicating Sequential Processeswww.usingcsp.com(http://www.usingcsp.com)Códigos da palestragithub.com/fsouza/go-devincachu(https://github.com/fsouza/go-devincachu)
  52. 52. Thank youFrancisco SouzaDev in Cachu 2013@franciscosouza(http://twitter.com/franciscosouza)f@souza.cc(mailto:f@souza.cc)http://f.souza.cc(http://f.souza.cc)

×