A Linguagem de Programação Go
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

A Linguagem de Programação Go

on

  • 2,062 views

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

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

Statistics

Views

Total Views
2,062
Views on SlideShare
2,061
Embed Views
1

Actions

Likes
2
Downloads
20
Comments
0

1 Embed 1

https://duckduckgo.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

A Linguagem de Programação Go Presentation Transcript

  • 1. A linguagem de programação GoFrancisco SouzaDev in Cachu 2013
  • 2. program mainprint *, "Hello world!"end program
  • 3. what the f**rancisco?!open source fanboyDesenvolvedor na Globo.comUsa Go diaramente para construir o Tsurutsuru.io(http://tsuru.io)
  • 4. Go?Uma linguagem focada em algumas características...EficiênciaSegurançaConcorrênciaEscalabilidadeUm mascote legal :)
  • 5. Por que uma nova linguagem?
  • 6. Linguagens estáticas
  • 7. package mainimport "fmt"func main() {fmt.Println("#devincachu 2013: eu fui! :D")} Run
  • 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. Tempo de compilação (cont.)
  • 10. Linguagens dinâmicas
  • 11. Go: o melhor dos dois mundos?
  • 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. 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. Aspectos da linguagem
  • 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. 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. 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. Loopsfor i := 0; i < 10; i++ {fmt.Println(i)}for {fmt.Println("Looping forever")break // not really}
  • 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. 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. 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. Tipostype Person struct {Name stringBirth time.Time}type MyString stringtype MyInt intNo pacote :type Duration int64
  • 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. 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. Métodos (cont.)type MyInt intfunc (i MyInt) String() string {return fmt.Sprintf("%d", i)}
  • 26. Interfaces
  • 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. 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. Tratamento de erros
  • 30. Lidando com errosNo construtor do tipo , o segundo retorno é do tipo .func NewPerson(name string, birth time.Time) (*Person, error) {
  • 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. Concorrência
  • 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. 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. CSP em GoProcessos -> goroutinesCanais -> canais :-)
  • 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. 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. 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. Concorrência vs Paralelismo
  • 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. Hands on
  • 42. Download de arquivosO exemplo visa demonstrar um client que baixa arquivos do site textfiles.com.
  • 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. 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. 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. 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. 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. 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. 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. Demonstração
  • 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. 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)