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

Uma introdução ao Go

Uma introdução ao Go

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/