Go Workshop - Dia 4

https://golang-workshop.io

Rodolfo Finochietti

rodolfofinochietti.me

Programando una App Web - HTTP Router

Ejercicio 20
2

Gin Web Framework

"Gin is a high-performance micro-framework that delivers a very minimalistic framework that carries with it only the most essential features, libraries, and functionalities needed to build web applications and microservices."

3

Gin Web Framework - Caracteristicas

4

Gin Web Framework

Ejercicio 21
$ go get -u github.com/gin-gonic/gin
$ go get -u github.com/gin-gonic/contrib/static
5

HTTP Client

Ejercicio 22

El paquete https://golang.org/pkg/net/http/ contiene una implementacion de un cliente http que permite emular las acciones que realiza un web browser.

6

HTTP Client - GET

resp, _ := http.Get("https://httpbin.org/get")
defer resp.Body.Close()

data, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(data))
7

HTTP Client - POST

payload := "Hello world!"
resp, _ := http.Post("https://httpbin.org/post", "text/plain", strings.NewReader(payload))
defer resp.Body.Close()

data, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(data))
8

Programacion funcional

Functional Programming by Wikipedia:

Functional programming is a programming paradigm that treats computation 
as the evaluation of mathematical functions and avoids state and mutable data

En otras palabras la programacion funcional promueve codigo sin cambios en los valores de las variables para evitar efectos no esperados.

Es lo opuesto de la programacion imperativa, que enfatiza los cambios de estado.

9

Programacion funcional

Esto quiere decir que:

10

Programacion funcional - Ventajas

No hay razon para lo que Einstein definio como locura:
"hacer la misma cosa una y otra vez esperando diferentes resultados"
11

Programacion funcional en Golang

Golang es un lenguaje de programacion multi-lenguaje, no es un lenguaje funcional, pero tiene caracteristicas que nos permiten desarrollar codigo que aplique los principios de la programacion funcional.

12

Programacion funcional en Golang - Nunca actualizar, siempre crear

Strings

Mal

name := "Juan"
name := name + " Carlos"

Bien

const firstname = "Juan Carlos"
const lasname = "Batman"
const name = firstname + " " + lastname
13

Programacion funcional en Golang - Nunca actualizar, siempre crear

Arrays

Mal

years := [4]int{2001, 2002}
years[2] = 2003
years[3] = 2004
years // [2001, 2002, 2003, 2004]

Bien

years := [2]int{2001, 2001}
allYears := append(years, 2003, [2]int{2004, 2005}
14

Programacion funcional en Golang - Nunca actualizar, siempre crear

Maps

Mal

ages := map[string]int{"John": 30}
ages["Mary"] = 28
ages // {"John": 30, "Mary": 28}

Bien

ages1 := map[string]int{"John": 30}
ages2 := map[string]int{"Mary": 28}
func mergeMaps(mapA, mapB map[string]int) map[string]int {
    allAges := make(map[K]V, len(ages1) + len(ages2))
    for k, v := range mapA {
        allAges[k] = v
    }
    for k, v := range mapB {
        allAges[k] = v
    }
    return allAges
}
allAges := mergeMaps(ages1, ages2)
15

Programacion funcional en Golang - Higher Order Functions

Las funciones son first-class objects en Golang, si se quiere pasar una funcion a otra funcion, se debe tratar como cualquier otro objeto.

func caller(f func(string) string) {
    result := f("Juan")
    fmt.Println(result)
}

f := func(s name) string {
    return "Hola " + name
}

caller(f)
16

Programacion funcional en Golang - Currying

Tener higher order functions habilita el currying, que es la posibilidad de tomar una funcion que recibe n parametros y convertirla en la composicion de n funciones que reciben 1 parametro:

func plus(x, y int) int {
    return x + y
}

func partialPlus(x int) func(int) int {
    return func(y int) int {
        return plus(x, y)
    }
}

func main()
{
    plus_one := partialPlus(1)
    fmt.Println(plus_one(5)) //prints 6
}
17

Google App Engine Deploy

Crear un proyecto

$ gcloud projects create PROJECT_ID

Configurar el proyecto por defecto en nuestro entorno

$ gcloud config set project PROJECT_ID

Crear una nueva aplicacion en GAE

$ gcloud app create
18

Google App Engine Deploy - Service Configuration File

Agregar un archivo app.yaml

runtime: go115

env_variables:
  GOLANGORG_CHECK_COUNTRY: true

nobuild_files: views/
19

Google App Engine Deploy

Subir la aplicacion a GAE

$ gcloud app deploy

Abrir la aplicacion

$ gcloud app browse

* Building a Go App on App Engine

20

Azure Deploy

$ curl -O https://storage.googleapis.com/golang/go1.16.windows-386.zip
$ unzip go1.16.windows-386.zip

Comprobar la ultima version en https://golang.org/dl
No preocuparse si aparece el error Bad Request
http.ListenAndServe(":"+os.Getenv("HTTP_PLATFORM_PORT"), nil)
21

Azure Deploy

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
<handlers>
    <add name="httpplatformhandler" path="*" verb="*" 
    modules="httpPlatformHandler" 
    resourceType="Unspecified" />
</handlers>
<httpPlatform processPath="d:\home\site\wwwroot\go\bin\go.exe" 
      arguments="run d:\home\site\wwwroot\server.go" 
      startupTimeLimit="60">
    <environmentVariables>
      <environmentVariable name="GOROOT" value="d:\home\site\wwwroot\go" />
    </environmentVariables>
</httpPlatform>
    </system.webServer>
</configuration>
22

Review time

23

Challenge 4

Instrucciones del challenge 4

Modificar la API Rest del challenge 3.3 para usar Gin.

24

Thank you

Rodolfo Finochietti

rodolfofinochietti.me

Use the left and right arrow keys or click the left and right edges of the page to navigate between slides.
(Press 'H' or navigate to hide this message.)