Git Product home page Git Product logo

class.dio.webinar-go-first-steps's Introduction

Introdução a Linguagem de Programação Go - Webinar

image

Este projeto foi criado com o objetivo de dar suporte ao Webinar sobre Introdução a linguagem de programação Go

Material

Os slides da apresentação você encontra no SpeakerDeck e o vídeo você encontra no YouTube

Conteudo

Durante o live coding, evoluímos nosso raciocínio com uma sequencia de ações que foram sido desenvolvidas conforme a necessidade. Aqui foi exatamente o que fizemos durante o processo:

  1. Criamos nosso projeto iniciando um projeto com o Go Modules

    $ go mod init github.com/marcopollivier/DigitalInnovationOne-WebinarGo
  2. Criamos uma estrutura onde ficaria o nosso arquivo main.go que ficaria dentro da estrutura cmd/server

  3. Dentro do arquivo main.go criamos um Hello, World!

    package main
    
    import "fmt"
    
    func main() {
        fmt.Println("Hello, world!")
    }

    3.1. Durante a apresentação dos slides mostramos como seria com mais de um import e como passar parâmetros

    package main
    
    import (
        "fmt"
        "os"
    )
    
    func main() {
        var name = os.Args[1]
    
        fmt.Println("Hello, " + name)
    }
  4. Depois evoluímos o exemplo para fazer uma espécie de Hello, World em um servidor http. Esse foi o início da criação do nosso Serviço REST.

    package main
    
    import (
           "fmt"
           "net/http"
    )
    
    func main() {
           http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
                   fmt.Fprintf(w, "Welcome to my website!")
           })
    
           http.ListenAndServe(":8080", nil)
    }
  5. Aumentamos a complexidade do nosso exemplo de serviço Rest que estamos criando e fizemos um método GET para retornar um JSON

    package main
    
    import (
            "encoding/json"
            "net/http"
    )
    
    func main() {
            http.HandleFunc("/clientes", getClientes)
    
            http.ListenAndServe(":8080", nil)
    }
    
    func getClientes(w http.ResponseWriter, r *http.Request){
        if r.Method != "GET" {
            w.WriteHeader(http.StatusMethodNotAllowed)
            return
        }
    
        w.Header().Set("Content-type", "application/json")
    
        var clientes = Clientes{
            Cliente{Nome: "Marco"},
            Cliente{Nome: "Julio"},
        }
    
        _ = json.NewEncoder(w).Encode(clientes)
    }
    
    type Cliente struct {
            Name string
    }
    
    type Clientes []Cliente
  6. E depois fizemos um Método POST.

    func postCliente(w http.ResponseWriter, r *http.Request){
    	if r.Method != "POST" {
    		w.WriteHeader(http.StatusMethodNotAllowed)
    		return
    	}
    
    	var res = Clientes{}
    	var body, _ = ioutil.ReadAll(r.Body)
    	_ = json.Unmarshal(body, &res)
    
    	fmt.Println(res)
    	fmt.Println(res[0].Nome)
    	fmt.Println(res[1].Nome)
    }
  7. Para os passos seguintes, nós vamos fazer uma integração com um BD qualquer. Para isso, vamos subir uma imagem Docker do Postgres pra poder fazer o nosso teste.

    Vamos subir o BD via Docker Compose

    host: localhost user: postgres pass: postgres DB: diodb

    version: "3"
    services:
      postgres:
        image: postgres:9.6
        container_name: "postgres"
        environment:
          - POSTGRES_DB=diodb
          - POSTGRES_USER=postgres
          - TZ=GMT
        volumes:
          - "./data/postgres:/var/lib/postgresql/data"
        ports:
          - 5432:5432
  8. Já com o banco acessível via Docker, vamos criar a base que utilizaremos no nosso teste

     CREATE TABLE users (
         id SERIAL PRIMARY KEY,
         age INT,
         first_name TEXT,
         last_name TEXT,
         email TEXT UNIQUE NOT NULL
     );
  9. Agora com a estrutra de banco criada, vamos fazer as alterações necessárias no código. E a primeira delas é baixar a dependência do driver do Postgres.

    Lista de SQLDrivers disponíveis

    Execute o seguinte comando dentro da pasta do projeto

    $ go get -u github.com/lib/pq
  10. E esse é o código que vai manipular as informações do banco de fato

    Crie as constantes de conexão

    const (
        host     = "localhost"
        port     = 5432
        user     = "postgres"
        password = "postgres"
        dbname   = "diodb"
    )

    A função que será utilizada para fazer a consulta no banco

    func db() User {
        psqlInfo := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", host, port, user, password, dbname)
        var db, _ = sql.Open("postgres", psqlInfo)
        defer db.Close()
    
        var sqlStatement = `SELECT * FROM users WHERE id=$1;`
        var user User
        var row = db.QueryRow(sqlStatement, 2)
    
        _ = row.Scan(&user.ID, &user.Age, &user.FirstName, &user.LastName, &user.Email)
    
        fmt.Println(user)
    
        return user
    }

    E a struct que você utilizará para fazer o mapeamento com a tabela criada

    type User struct {
        ID          int `json:"id"`
        Age         int `json:"age"`
        FirstName   string `json:"first_name"`
        LastName    string `json:"last_name"`
        Email       string `json:"email"`
    }

Considerações finais

Nessa live partimos de algumas premissas. Algumas delas relacionadas a uma falsa sensação de que Go é uma linguagem complicada de se usar e que só serviria para projetos complexos e até mesmo que seria uma linguagem que não pensa em sua comunidade. E com essas premissas na mesa, o principal objetivo era mostrar que tudo isso são lendas que ganham força, mas que não fazem, necessariamente, sentido. Com isso, mostramos que Go é uma linguagem que, apesar de nova, já oferece recursos bem sofisticados, flexível, simples e performática. Espero que ao final desse material essas características tenham ficado claras para qualquer pessoa, seja iniciante ou não.

E esse foi o ponto onde chegamos no final do nosso encontro. Com ele nós conseguimos ver:

  • Como criar um projeto básico em Go
  • Como fazer um gerenciamento básico de dependências
  • Como criar um Hello, World
  • Como criar um serviço HTTP simples
  • Como criar métodos GET e POST no nosso serviço HTTP
  • Como manipular JSON
  • Como trabalhar com acesso ao BD

Espero que o material tenha sido proveitoso e que o conteúdo esteja claro.

Lembre-se que em caso de dúvidas, me procure nas redes.

Até mais e bons estudos.

Não deixe de tirar duvidas

Esse material foi preparado com muito carinho e portanto qualquer comentário ou sugestão será super bem-vinda.

Me procure no Linkedin, Twitter, Instagram ou Telegram e podemos trocar uma ideia.

Você também pode abrir uma issue aqui mesmo no projeto.

TODO

  • Adicionar um changelog aqui no final

class.dio.webinar-go-first-steps's People

Contributors

marcopollivier avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.