Go Workshop - Dia 2

https://golang-workshop.io

Rodolfo Finochietti

Chief Delivery Officer, Lagash

Structs

Ejercicio 14

Golang favorece la composicion por sobre la herencia:

type Employee struct {
    firstName string
    lastName string
    age int
}
2

Structs anidados

Ejercicio 14
type Address struct {
    city, state string
}

type Employee struct {
    firstName, lastName string
    age int
    address Address
}

var emp Employee

emp.firstName = "SomeThing"
emp.address = Address {
    city  : "AA",
    state : "CO",
}
3

Structs - Metodos

Ejercicio 14

Un metodo no es mas que una funcion con un argumento receptor especial

type Employee struct {
    firstName string
    lastName string
    age int
}

func (e Employee) Print() {
    fmt.Println("Employee Record:")
    fmt.Println("Name:", e.firstName, e.lastName)
    fmt.Println("Address:", e.address)
}

var emp Employee

emp.Print()
4

Punteros

Ejercicio 14
func (e *Employee) updateAge(newAge int) {
    e.age = newAge
}
emp := Employee{
    age: 33,
}

fmt.Println("Before:", emp.age)
emp.updateAge(34)
fmt.Println("After:", emp.age)
5

Structs compuestos

Ejercicio 14

Composition Design Pattern

type Dog struct{}

func (d *Dog) Bark() {
    fmt.Println("Woof!")
}

type GuideDog struct {
    *Dog
}

func (gd *GuideDog) Help(h *Human) {
    fmt.Printf("Please help me (%s)", gd.Name())
}
6

Interfaces

Ejercicio 15

Lo mas importante de las interfaces es la cultura detras de ellas, piezas de codigo chicas que abstraen funcionalidades.

Understanding Go Interfaces

7

Interfaces values

Ejemplo

Los valores de la interfaz pueden considerarse como una tupla de un valor y un tipo concreto, esto se llaman interface value:

(value, type)
8

The empty interface

Ejemplo

Una interfaz sin metodos se conoce como interfaz vacia:

interface{}
9

Type assertions

Ejemplo

El mecanismo de type assertion provee acceso a los valores concretos de un interface value:

t := i.(T)

La instruccion anterior comprueba que el interface value i contiene el tipo concreto T y asigna el valor a la variable t.

Para comprobar que una interfaz almacena un tipo especifico se usa:

t, ok := i.(T)
10

Type switches

Un type switch es un mecanismo que permite hacer type assertions en serie:

switch v := i.(type) {
case T:
    // here v has type T
case S:
    // here v has type S
default:
    // no match; here v has the same type as i
}
11

Creacion de tipos - make

slice := make([]int, 0, 10)
12

Creacion de tipos - new

type Person struct {
    Name string
    Age  int
}
juan := new(Person)
13

Creacion de tipos - Struct Types

var juan Person
rect.Name = "Juan"
rect.Age = 40
14

Creacion de tipos - Struct Literal y &

La inicializacion implicita mas el & es equivalente a new.

juan := Person{"Juan", 22}
juanPointer := &Person{Name: "Juan", Age: 22}
15

Challenge 2.1

Modelar la funcionalidad de un sistema de precios para una aerolinea que calcule los ingresos netos de un vuelo en base a los pasajeros y el precio base del ticket.

El precio base del ticket es el mismo para todos los pasajeros.

Existen 3 tipos de pasajeros:

16

Challenge 2.2 (Opcional)

Crear un test para verificar el codigo creado en el challenge 2.1 anterior.

17

Challenge 2.3

Agregar un nuevo tipo de pasajero 'empleado de aerolinea de ultimo minuto' cuyo descuento sea la suma de los descuentos de los tipos de pasajero 'empleado de aerolinea' y 'ultimo minuto'.

18

Concurrencia - Go-Routines

19

Concurrencia - Channels

20

Challenge 3

Instrucciones del challenge 3
21

Programando una API REST - HTTP Router

Se instala con:

$ go get -u github.com/gorilla/mux
22

Programando una API REST - HTTP Router

Ejercicio 18
package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/mux"
)

func helloWorld(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello World")
}

func main() {
    router := mux.NewRouter().StrictSlash(true)
    router.HandleFunc("/", helloWorld)
    log.Fatal(http.ListenAndServe(":8080", router))
}
23

Programando una API REST - JSON Encoding

Ejercicio 18
24

Programando una API REST - JSON Encoding

package main

import (
    "encoding/json"
    "fmt"
    "os"
)

type data struct {
    Num  int    `json:"Num"`
    Text string `json:"Text"`
}

func main() {
    var newData data

    json.Unmarshal([]byte("{\"Num\":1,\"Text\":\"Test_1\"}"), &newData)

    fmt.Println(newData)

    json.NewEncoder(os.Stdout).Encode(newData)
}
25

Challenge 4

Crear una API REST para una aplicacion de recordatorios (To-Do) que contenga todas las funciones CRUD para la siguiente entidad:

ID     int
Title  string
IsDone bool

Hints:

26

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