Go (Español)
Go es un lenguaje de tipado estático con una sintaxis ligeramente derivada de la de C, añadiendo gestión de memoria con recolector de basura, seguridad de tipado, algunas capacidades de tipado dinámico, tipados adicionales incorporados como arrays de longitud variable y mapas clave-valor, y una gran librería estándar.
Instalación
El compilador estándar de Go es go
, el cual se puede instalar desde el paquete go. La orden go
también incluye varias herramientas como go get
, go doc
, etc.
Una alternativa es gcc-go, que se trata de un frontend de Go para la colección de compiladores GNU (GCC). En algunos casos gccgo
puede realizar mejores optimizaciones. En caso de duda, utilice go
.
Un paquete adicional que la mayoría de los desarrolladores de Go querrán instalar es go-tools. Esto proporciona varias herramientas de uso común que facilitarán el trabajo con Go, como goimports
, guru
, gorename
, etc.
Probar la instalación
Puede comprobar que Go se ha instalado correctamente compilando un programa relativamente sencillo, como el que se muestra a continuación:
hello.go
package main import "fmt" func main() { fmt.Println("Hola, Arch!") }
Posteriormente, ejecútelo con la herramiento go:
$ go run hello.go
Hola, Arch!
Compilación con el compilador estándar gc (lo mismo que go build -compiler=gc hello.go
):
$ go build hello.go
Compilación con gccgo (lo mismo que go build -compiler=gccgo hello.go
):
$ gccgo hello.go -o hello
$GOPATH
Go espera que el código fuente se halle dentro de $GOPATH
, el cual se establece por defecto en ~/go
.
go env
Cree el espacio de trabajo:
$ mkdir -p ~/go/src
El directorio ~/go/src
se utiliza para almacenar las fuentes de los paquetes. Al compilar, Go también creará bin
para los ejecutables y pkg
para almacenar los paquetes individuales. Probablemente quiera añadir ~/go/bin
a la variable de entorno $PATH
para ejecutar Go:
export PATH="$PATH:$HOME/go/bin"
Ejecute la orden go help gopath
para obtener más información.
$GOPATH
funciona como $PATH
y puede contener múltiples entradas, esto puede ser útil para dividir los paquetes descargados con go get
y su propio código fuente; por ejemplo, GOPATH=$HOME/go:$HOME/mygo
Compilación cruzada a otras plataformas
La orden go
puede compilar de forma nativa a un número de plataformas.
Si cgo no es necesario para la compilación, entonces simplemente especifique el sistema operativo de destino y la arquitectura como variables de entorno a go build
:
$ GOOS=linux GOARCH=arm64 go build .
Véase la documentación oficial para las posibles combinaciones de $GOOS
y $GOARCH
.
Por otro lado, si se requiere de cgo para la compilación, se tiene que proporcionar la ruta a sus compiladores cruzados C/C++
, a través de las variables de entorno $CC/$CXX
.
Supongamos que desea compilar para $GOOS=linux
y $GOARCH=arm64
.
Primero necesita instalar el compilador cruzado aarch64-linux-gnu-gcc.
He aquí hay un programa de ejemplo que requiere cgo
, para que podamos probar el proceso de compilación cruzada:
$ cat > hello.go <<EOF package main // #include <stdio.h> // void hello() { puts("Hola, Arch!"); } import "C" func main() { C.hello() } EOF
Después, puede realizar compilación cruzada así:
$ GOOS=linux GOARCH=arm64 CGO_ENABLED=1 CC=/usr/bin/aarch64-linux-gnu-gcc go build hello.go
Puede comprobar que la arquitectura del binario generado es realmente aarch64
:
$ file hello hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=b1d92ae8840a019f36cc2aee4606b6ae4a581bf1, for GNU/Linux 3.7.0, not stripped
Si copia hello
a un host adecuado, puede probar a ejecutarlo:
[alarm@rpi3 ~]$ uname -a Linux alarm 5.3.8-1-ARCH #1 SMP Tue Oct 29 19:31:23 MDT 2019 aarch64 GNU/Linux [alarm@arpi3 ~]$ ./hello Hola, Arch!
Solución de problemas
Plugin Go Jetbrains
Si está usando un IDE Jetbrains y el plugin Go no puede encontrar su ruta de Go SDK, puede que esté usando un paquete incompatible. Elimine el paquete gcc-go
y reemplácelo por go
. Si su $GOPATH
está configurado, el IDE debería entonces ser capaz de encontrar su Go SDK en /usr/lib/go
.