Go lang en Windows

Debido a que he tenido ciertas dificultades, y en que la pagina oficial esta explicado para Linux o Mac, hoy vamos a ver como instalar Go, compilar  algun programa,  los paquetes, dar formato, generar documentación  y hacer test sobre nuetros programas escritos en Go(vaya, es bastante!) sobre Windows.

El primero paso no es, como muchos podrían esperar, instalar Go ni sus compiladores. El primer paso en Go es hacer el tutorial. Realmente imprescindible ya que el idioma es bastante “complicado” de primeras. Así que todos aquellos que no lo hayan hecho, por favor dirijanse a partirse la cabeza un rato con el idioma y ver si les gusta o prefieren seguir programando en HTML: http://tour.golang.org/#1

El segundo paso, ya sí, es instalar Go en nuestro ordenador:  http://golang.org/doc/install

Una vez instalado nos tenemos que asegurar de que las variables del entorno estan bien definidas(y aquí es donde yo he tenido los mayores problemas).
Resulta ser que Go se empeña en usar cierto tipo de arquitectura a la hora de organizar los programas, me refiero al workspace. Nos obligan a tener un workspace con cierta jerarquía para que funcione todo bien, lo cual al principio me chocaba cuando lo único que quería era compilar un archivo  y comprobar que funcionaba.

Así que el tercer paso será crearnos nuestro workspace. Yo por ejemplo lo tengo en el escritorio y lo he llamado “Go”.  Dentro de esta carpeta tiene que haber otra carpeta llamada “src” y que es obligatoria para que funcionen las cosas.

Así pues tendremos una carpeta “Go” y dentro otra llamada “src”.

Ahora nos vamos a las propiedades del sistema de  Windows(botón derecho sobre Mi Equipo -> Propiedades)  y luego accedemos a las “Opciones avanzadas”  -> “Variables de entorno”. Una vez allí nos fijamos en las variables del sistema, que deben contener un par de variables: GOROOT con valor vuestro directorio de instalación de Go ( por defecto C:\Go\) y luego en la variable  Path debe estar incluida la cadena C:\Go\bin.  Ahora vamos a definir una nueva variable GOPATH con valor el directorio de vuestro workspace, en mi caso C:\Users\Ouro\Desktop\Go\workspace.

Una vez definidas las variables ya podemos empezar a programar en Go.

Abrimos el cmd y accedemos a la carpeta C:\Users\Ouro\Desktop\Go\workspace\src donde crearemos con mkdir un directorio hello y accedemos a ella.

Ahora con nuestro editor preferido crearemos el siguiente código y lo guardaremos como hello.go

package main

import "fmt"

func main() {
    fmt.Println("Hola anotherprogrammingblog!")
}

Para testearlo simplemente escribimos go run hello.go y vemos que la salida es correcta.
Una vez hecho esto nos preguntamos ¿Dónde diantres esta el ejecutable? Pues bien, si  has hecho todo lo de las variables del sistema correctamente ahora simplemente tienes que escribir go install y nos creará un ejecutable en C:\Users\Ouro\Desktop\Go\workspace\bin

Bien, ya tenemos lo básico, así que ahora vamos a ver como crear un paquete. Para ello creamos con mkdir una nueva carpeta llamada string y como antes, crearemos un archivo string.go con el siguiente código:

/*
 Package string implementa una librería simple para
 realizar operaciones sobre strings

 */

package string

// Le da la vuelta a una string
func Reverse(s string) string{
 b := []byte(s) // Creamos un array de bytes de la string
 for i := 0; i < len(b)/2; i++ { // Ahora tenemos que cambiar la primera mitad
 j := len(b) -i - 1 // Por la segunda mitad
 b[i], b[j] = b[j], b[i]
 }

 return string(b)
}

Como veís, he escrito comentarios y algunas cosas mal indexadas para ahora realizar un par de cositas:
Primero vamos a ver si el formato es correcto, si ejecutamos gofmt string.go nos debería salir  una salida con “el formato correcto según Go  en mi caso:

/*
 Package string implementa una librería simple para
 realizar operaciones sobre strings
*/
package string

// Le da la vuelta a una string
func Reverse(s string) string {
 b := []byte(s) // Creamos un array de bytes de la string
 for i := 0; i < len(b)/2; i++ { // Ahora tenemos que cambiar la primera mitad
 j := len(b) - i - 1 // Por la segunda mitad
 b[i], b[j] = b[j], b[i]
 }

 return string(b)
}

Tenéis que tener cuidado con los comentarios, ya que si lo copiais desde cmd las cosas suelen salir mal, pero la idea detrás de gofmt se entiende no? Nos proporciona el formato que consideran mejor para nuestro código.

Si ahora ejecutamos godoc string nos saldrá lo siguiente:
PACKAGE DOCUMENTATION

package string
import “string”

Package string implementa una librería simple para
realizar operaciones sobre strings

FUNCTIONS

func Reverse(s string) string
Le da la vuelta a una string

Es decir, godoc nos devuelve la “documentación” que hemos escrito en el programa, esto es útil para averiguar que hacia cierto archivo sin tener que abrirlo y mirar el código.

Ahora sigamos con la parte principal de nuestra tarea, crear el paquete, para ello escribimos go build seguido de un go install. Esto nos creara un nuevo directorio pkg en C:\Users\Ouro\Desktop\Go\workspace\ con un subdirectorio dependiendo de nuestra arquitectura, en mi caso es C:\Users\Ouro\Desktop\Go\workspace\pkg\windows_amd64

Y allí adentro vemos un archivo string.a que es nuestro paquete instalado.

Vamos a usar este paquete en el programa hello. Editamos hello.go de la siguiente manera:

package main

import (
"fmt"
"string"
)

func main() {
fmt.Println(string.Reverse("Hola anotherprogrammingblog!"))
}

y volvemos a hacer go install. Si todo ha salido bien al ejecutar el programa nos saldrá:

!golbgnimmargorprehtona aloH

Ahora vamos a enseñar a hacer tests. Los test son cosas muy importante a la hora de programar ya que nos permite asegurarnos un poco más de la calidad de nuestro programa.

Accedemos a la carpeta de string y creamos un nuevo archivo string_test.go con el siguiente código:

package string

import "testing"

func Test(t *testing.T) {
	var tests = []struct {
		s, want string
		}{
			{"Backward","drawkcaB"},
			{"Hello, 世界", "界世, olleH"},
			{"",""},
		}

		for _, c := range tests {
			got := Reverse(c.s)

			if got != c.want {
				t.Errorf("Reverse(%q) == %q, el correcto es %q", c.s, got, c.want)
			}
		}
}

Y una vez que guardemos ejecutamos go test, que nos lanzará un error debido a que 世界  no es devuelto de manera correcta. Eso es debido a que nuestra función Reverse no maneja bien los  códigos Unicode o UTF. Si cambiamos la función Reverse  de la siguiente manera debería funcionar:

func Reverse(s string) string {
        b := []rune(s)                  // Creamos un array de bytes de la string
        for i := 0; i < len(b)/2; i++ { // Ahora tenemos que cambiar la primera mitad
                j := len(b) - i - 1 // Por la segunda mitad
                b[i], b[j] = b[j], b[i]
        }

        return string(b)
}

(En realidad, al usar el cmd de Win no te funcionará ya que no reconoce estos carácteres…)

Los ejemplos los he sacado de http://www.youtube.com/watch?v=XCsL89YtqCs

Espero que os haya servido de ayuda  este post tan largo y disfruteís programando en Go, que es un idioma muy bonito y chungo a la vez.