Go Go
Power Rangers

Carlos Fernández Llamas @sirikon

Hippie Developer at Plain Concepts

¿Qué es Go?

Go es un lenguaje open source con sintaxis inspirada en C con el objetivo de facilitar la creación de software simple, confiable y eficiente

Utiliza tipado estático, es compilado y hace uso de un recolector de basura.

¿Qué lo hace especial?

Concurrencia

Go implementa canales y gorutinas para facilitar la programación concurrente.

Las gorutinas son procesos ligeros que corren a parte del hilo principal.

Los canales son colas FIFO que permiten la comunicación entre gorutinas

Errors are values

// C#
try
{
    var result = complicatedOperation(parameter);
}
catch (Exception ex)
{
    handleException(ex)
}
// Go
result, err := complicatedOperation(parameter)
if err != nil {
    handleError(err)
}

Extensa librería estándar

  • Servidor/Cliente HTTP
  • Plantillas HTML
  • Criptografía
  • Compresión de ficheros
  • Conexión a bases de datos
  • ...

Demo!

Ventajas

  • Concurrencia simple
  • Sintaxis muy sencilla
  • Librería estándar comprensible y extensa
  • Tooling estándar extenso.
    • El 90% de las herramientas de desarrollo que uses, serán oficiales.
  • Errores explícitos
  • Un único binario como resultado.

Inconvenientes

  • "No es un lenguaje moderno"
    • La eterna queja de que faltan Generics.
  • Control de errores verboso.
    • Sin trucos "inteligentes" se vuelve muy verboso el control de errores. Ejemplo.

Demo!

Para qué sirve Go

  • Ese software que debe hacer algo muy específico, pero debe hacerlo rápido y bien.
    • ​Twitch y su re-implementación del chat.
  • ​Herramientas de consola.
    • ​Único binario sin dependencias, ejecución instantánea, comprimible.
  • ​"El lenguaje del cloud"
    • ​Se ha popularizado enormemente en entornos de Cloud para orquestación y procesado de datos.

Para qué NO sirve Go

  • Reemplazar ese lenguaje dinámico/interpretado que utilizas por defecto para todo.
  • Aplicaciones donde sólo te importa el Happy Path.
    • Existen, son comunes, totalmente válidas, y Go no es buen candidato para hacerlas.
  • Interfaces de usuario y cosas interactivas (videojuegos...)
    • El lenguaje es algo "rígido" en estos ámbitos y el tema está demasiado verde.

Package Management

GOPATH

Vendors

Go Modules

IDEs

Atom

Vim

La comunidad

Buenas prácticas de la comunidad

Mejor un pequeño código que una pequeña dependencia

Mejor una librería que un framework

Evita interface{} a toda costa

Controla tus errores, o retórnalos

Controla tus propios panics. Siempre.

Go 2

¡Generics!

type Set(type T Equal) []T

// Find returns the index of x in the set s,
// or -1 if x is not contained in s.
func (s Set(T)) Find(x T) int {
	for i, v := range s {
		if v == x {
			return i
		}
	}
	return -1
}

¡Error Handling!

handle err {
    return fmt.Errorf("copy %s %s: %v", src, dst, err)
}

r := check os.Open(src)
defer r.Close()

Librerías Populares

  • Servidor web
    • Gin Gonic
  • Acceso a datos
    • sqlx
    • gorm
    • go-sqlite3
    • mgo
    • mongo-go-driver
  • CLI
    • urfave/cli
    • cobra

Quiero aprender Go.¿Dónde empiezo?

  • Go Tour
  • Coge algo que ya hayas hecho y re-impleméntalo en Go.

Dónde me entero de las novedades

¿Preguntas?

¡Gracias!

Carlos Fernández Llamas @sirikon

Hippie Developer at Plain Concepts

Made with Slides.com