Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Uma introdução ao Go

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

Uma introdução ao Go

Avatar for João Maia

João Maia

January 20, 2018
Tweet

More Decks by João Maia

Other Decks in Programming

Transcript

  1. ?

  2. Origem e motivações da linguagem - I • Robert Griesemer,

    Rob Pike e Ken Thompson em setembro de 2007; • Janeiro de 2008, primeira versão do Ken gerando código em C; • Maio de 2008, Ian Taylor adiciona no GCC; • Ainda em 2008, Russ Cox entra para o time de desenvolvimento; e • Novembro de 2009, Go é divulgada para o público.
  3. Origem e motivações da linguagem - II • Frustação com

    o ambiente de desenvolvimento para sistemas; • Combinação das melhores partes de tipagem dinâmica e estática, eficiência e segurança; • Simples, moderna e gerando apenas um binário; • Concorrência e coletor de lixo; • Forte dependência; • Heranças de C/Pascal/Modula/Oberon; e • Inspirada em Tony Hoare's CSP (Communicating sequential processes).
  4. Conceitos básicos sobre Go • Poucas palavras reservadas; • Goroutines;

    • Channels; • Tooling (go vet, go fmt, …); • Possui GC; • Interfaces; e • Rica biblioteca padrão.
  5. “Hello, world!” em Go package main import "fmt" func main()

    { fmt.Println("Hello, world!") } $ go run hello.go Hello, world! $ go build hello.go $ ./hello Hello, world!
  6. Desenvolvendo para Web Requisitos tradicionais: • Entender o protocolo HTTP;

    • Comunicação via Socket; • Serializar dados com JSON; • Escrever em arquivo de log; e • Comunicação com banco de dados.
  7. $ go run hello-web.go <abra outro terminal> $ curl localhost:8080

    Olá, GDG-ES! “Hello, world!” versão Web em Go - I package main import ( "fmt" "net/http" ) func hello(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "Olá, GDG-ES!") } func main() { http.HandleFunc("/", hello) http.ListenAndServe(":8080", nil) }
  8. “Hello, world!” versão Web em Go - II $ curl

    localhost:8080 Olá, GDG-ES! $ curl localhost:8080/1 Olá, GDG-ES! $ curl localhost:8080/asdf Olá, GDG-ES! $ curl localhost:8080/asdf/gdg-es Olá, GDG-ES! $ curl localhost:8080/asdf/gdg-es?foo=bar Olá, GDG-ES! Eita!
  9. Resolvendo o problema de rotas package main import ( "fmt"

    "net/http" "github.com/gorilla/mux" ) func hello(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "Olá, GDG-ES!") } func main() { r := mux.NewRouter() r.HandleFunc("/", hello) http.Handle("/", r) http.ListenAndServe("localhost:8080", r) } $ curl localhost:8080/ Olá, GDG-ES! $ curl localhost:8080/1 404 page not found 
  10. Escrevendo log - I package main import ( "log" "os"

    ) func main() { f, err := os.OpenFile("test.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { log.Fatalf("error opening file: %v", err) } defer f.Close() log.SetOutput(f) log.Println("Escrevendo no arquivo de log!") }
  11. Escrevendo log - II $ go run logfile.go $ cat

    test.log 2018/01/20 02:09:23 Escrevendo no arquivo de log!
  12. Melhorando o log com Logrus - I var log =

    logrus.New() func main() { file, err := os.OpenFile("logrus.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) if err == nil { log.Out = file } else { log.Info("Falha ao escrever no log, usando stderr") } log.WithFields(logrus.Fields{ "foo": "bar", "inc": 10, }).Info("Escrevendo no arquivo de log!") }
  13. Melhorando o log com Logrus - II $ go run

    logfile-logrus.go $ cat logrus.log time="2018-01-20T02:24:40-02:00" level=info msg="Escrevendo no arquivo de log!" foo=bar inc=10
  14. JSON func HealthCheckHandler(w http.ResponseWriter, r *http.Request) { type Health struct

    { Alive bool `json:"alive"` } w.WriteHeader(http.StatusOK) w.Header().Set("Content-Type", "application/json") status := Health{Alive: true} j, _ := json.Marshal(status) w.Write(j) } func main() { r := mux.NewRouter() r.HandleFunc("/health", HealthCheckHandler).Methods("GET") log.Fatal(http.ListenAndServe("localhost:8080", r)) } $ curl localhost:8080/health {"alive": true}
  15. Banco de dados - I • Não tem drivers nativos;

    • Tem um package SQL; e • Interface genérica apenas; WHY!?
  16. gvm

  17. Fontes • Go Doc - https://golang.org/doc • Handling 1 Million

    Requests per minute with Go - http://marcio.io/2015/07/handling-1-million-requests-per-minute-with-golang/ • Exemplos - https://github.com/jvrmaia/gdg-es-20-01-2018 • Mux - https://github.com/gorilla/mux • SQL Drivers - https://github.com/golang/go/wiki/SQLDrivers • Go Timeouts - https://blog.cloudflare.com/the-complete-guide-to-golang-net-http-timeouts/