Empezando a Programar en Go

Un poco de mí...

Julio López Montalvo

@theblasfem

Go

  • From 2009
  • Syntax derived from C++
  • Compiled
  • Safety
  • Statically tiped
  • Concurrent

https://blogs.dropbox.com/tech/2014/07/open-sourcing-our-go-libraries/

https://sendgrid.com/blog/convince-company-go-golang/

Currently using Go

 

  • Google
  • Airbrake
  • Sendgrid
  • Docker
  • Bitbucket
  • Cloudflare
  • Canonical
  • Digital Ocean
  • Dropbox
  • Heroku
  • .... more and more

https://code.google.com/p/go-wiki/wiki/GoUsers

Instalación

golang.org/doc/install

Hello World

En un archivo hello.go :

Set up

Crear los directorios:

C:\Go\src\github.com\user\hello

No olvides reemplazar "user" con tu username en github y "hello" con el nombre de tu package

Dentro del folder /hello agrega tus archivos .go

Ahora solo queda compilar e instalar tu package, ubicado dentro del folder de tu package:

Compílalo para ver si hay algún error con:

$go build

Sino hay errores, procede a instalar tu package con:

$go install

Ahora, si revisas dentro de C:\Go\bin encontrarás un archivo con el nombre de tu package, (un .exe si estás en Windows), este es un binario que puedes ejecutar en cualquier lugar(claro, solo si tienes tu $GOPATH/bin como variable de sistema), ejemplo:

Demo

Variables

//declaracion: var nombre tipo
var n int
//inicializacion
n = 2

//tambien puedes declarar e inicializar en la misma linea:
//Aquí Go infiere el tipo de dato
var n = 2

//También tienes otra sintaxis usando ':='
n := 2

//Declarando muchas variables:
var name string
var age int
var city string

//Pueden ser reducidas a:
var(
  name, city string
  age int
)

If/Else

//El if de toda la vida, pero acá puedes agregar
//una línea más para ejecutarla antes de los condicionales

//Declaramos una variable antes de entrar a las condiciones
if num := 9; num < 0 {
  fmt.Println(num, "es negativo")
} else if num < 10 {
  fmt.Println(num, "tiene 1 digito")
} else {
  fmt.Println(num, "tiene multiples digitos")
}

For

//For clásico
for i := 0; i < 10; i++ {
  fmt.Print(i)
}

//Empleándolo como un while:
var suma int
for suma < 100 {
  suma += suma
}

Switch

respuesta := "B"
switch respuesta{
  case "A", "C", "D", "E":
    "Incorrecto"
  case "B":
    "Correcto"
  default:
    "No encontrada"
}

Arrays

//Un array de 5 integers
var a [5]int

//Indicando la longitud implícitamente e inicializando
//con valores
a := [...]int{1,2,3,4,5}

//Asignando Valores
a[0] = 5

Slices

//Un slice apunta a un array además de indicar una longitud
//Son creados con make, aquí un slice de strings con longitud 3
s := make([]string, 3)

//Agregando valores
s[0] = "a"

//También puedes usar append
s = append(s, "b")

//Soporte al "reslice"
letters := []string{"a", "b", "c", "d", "e"}
fmt.Print(letters[1:3])
//b, c

//Recorriendo un slice con range
names := []string{"Julio", "Abel", "Piero"}
//i recibe el index y e el elemento
for i, e := range names{
  fmt.Printf("%d: %s", i, e)
}
//0: Julio
//1: Abel
//2: Piero

Map

//Un map con key tipo string y value tipo int
m := make(map[string]int)

//Asignando valores
m["uno"] = 1

//Inicialización literal
m := map[string]int{"uno": 1, "dos": 2}

//Remover un key/value de un map
delete(m, "uno")

//Recorrerlo con range
fruits := map[string]string{"a": "apple", "b": "banana"}
for k, v := range users {
  fmt.Printf("%s : %s", k, v)
}
//a : apple
//b : banana

Functions

func sumar(a,b int) int {
  return a+b
}
fmt.Print(sumar(2,3))
//5

//Las funciones tambien pueden escribirse como variables
sumar := func(a,b int) int{
  return a+b
}

//Puedes retornar múltiples valores
func operacion(a, b int) int, int {
  return a+b, a*b
}
fmt.Print(operacion(2,3))
//5, 6

//E incluso mandar múltiples datos
func sumar(nums ...int){
  fmt.Print(nums)
}
sumar(1,2,3,4,5)
//[1,2,3,4,5]

Structs

type Person struct{
  name string
  age int
}

//Inicializando el struct
me := Person{"Gopher", 8}
fmt.Print(me)
//{Gopher 8}

//También podemos hacerlo de la manera:
me := Person{name: "Gopher", age: 9}

//Obteniendo valores
fmt.Printf("I'm %s and I've %d years", me.name, me.age)
//I'm Gopher and I've 8 years

//Cambiando valores
me.name = "Julio"
fmt.Print(me)
//{Julio 8}

Pointers

//Un puntero nos ayuda en referenciar una dirección
//en memoria de algún dato
i := 10

//Para asignar un puntero tenemos que usar el caracter &
//a la variable a la que querramos apuntar
pointer := &i

//Aquí imprimimos su dirección en memoria
fmt.Print(pointer)
//0x1043617c

//Aquí "dereferenciamos"(usando el *) al puntero para
//obtener el valor al dato al que apunta
fmt.Print(*pointer)
//10

//Si afectamos al puntero, los cambios serán aplicados
//al valor al que apunta en memoria
*pointer = 20
fmt.Print(i)
//20

Recursos

  • https://gobyexample.com/
  • https://tour.golang.org
  • http://www.golangbootcamp.com/
  • http://www.golang-book.com/
  • http://go-book.appspot.com/

Examples:

https://github.com/TheBlasfem/goexamples

Empezando a Programar en Go

By Julio López Montalvo

Empezando a Programar en Go

  • 3,185