Go Workshop - Dia 3

https://golang-workshop.io

Rodolfo Finochietti

Chief Delivery Officer, Lagash

Trabajando con MongoDB

Official MongoDB Go driver

$ go get -u go.mongodb.org/mongo-driver/mongo
2

Trabajando con MongoDB

Ejercicio 19
3

Challenge 4.2

Modificar la API Rest del challenge 4.1 para que pueda acceder a diferentes fuentes de datos (en memoria y MongoDB) usando el patron Repository.

Hints:

4

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."

5

Gin Web Framework - Caracteristicas

6

Gin Web Framework

Ejercicio 20
$ go get -u github.com/gin-gonic/gin
$ go get -u github.com/gin-gonic/contrib/static
7

Challenge 4.3

Modificar la API Rest del challenge 4.2 para usar Gin.

8

Error Handling

El manejo de excepciones es una de las caracteristicas mas controversiales en Golang.

9

Error Handling

func calculate(a, b int) (int, error) { }

result, err := caculate(a, b)
if err != nil {
    // handle the error
}
// continue
10

Defer

func CopyFile(dstName, srcName string) (written int64, err error) {
    src, err := os.Open(srcName)
    if err != nil {
        return
    }
    defer src.Close()

    dst, err := os.Create(dstName)
    if err != nil {
        return
    }
    defer dst.Close()

    return io.Copy(dst, src)
}
11

Panic y Recover

12

Panic y Recover

Ejemplo

All of Rob Pike's Go Proverbs

13

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.

14

HTTP Client - GET

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

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

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))
16

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.

17

Programacion funcional

Esto quiere decir que:

18

Programacion funcional - Ventajas

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

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.

20

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
21

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}
22

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)
23

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)
24

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
}
25

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
26

Google App Engine Deploy - Service Configuration File

Agregar un archivo app.yaml

runtime: go113

env_variables:
  GOLANGORG_CHECK_COUNTRY: true

nobuild_files: views/
27

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

28

Azure Deploy

$ curl -O https://storage.googleapis.com/golang/go1.13.windows-386.zip
$ unzip go1.13.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)
29

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>
30

Thank you

Rodolfo Finochietti

Chief Delivery Officer, Lagash

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.)