Índice del curso
Lección 1 — Instalar Go en tu Linux Mint y tu primer programa
Duración: 45-60 minutos (o 2 sesiones de 30). Es la única lección que no enseña Go como lenguaje: enseña la herramienta y el terreno donde vas a trabajar — y ese terreno tiene más trampas de las que parece a simple vista.
Al terminar vas a poder:
- Instalar la versión oficial y vigente de Go en Linux Mint, sin depender del paquete del sistema, y explicar por qué ese paquete está obsoleto por diseño, no por descuido.
- Explicar qué son
GOROOT,GOPATHy elPATH, y por qué Go no funciona hasta que tocas el segundo. - Reconocer la diferencia entre una terminal que lee tu configuración y una que no —la causa real de «lo agregué y de todos modos no funciona»— y saber cuál es la tuya.
- Crear un proyecto con
go mod init, escribir un programa y ejecutarlo congo run. - Producir un binario con
go buildy explicar, con una prueba real, por qué corre en otra máquina sin tener Go instalado. - Usar
go fmtpara no discutir nunca de estilo de código. - Reconocer, palabra por palabra, los mensajes de error más comunes de esta etapa —de compilador, de permisos y de ruta— y saber qué hacer con cada uno.
Por qué importa
Lo primero que un tutorial viejo te va a sugerir es apt install golang, y es un error. No es un error
menor de "versión un poco vieja": es la clase de error que te hace perder una tarde entera sin entender
por qué, semanas después de instalar, porque el síntoma no aparece al instalar — aparece cuando ya estás
programando y algo que "debería funcionar" no funciona.
Esto no se opina, se mide. El 30-sep-2026 medí, en un contenedor con la misma base que Linux Mint 22.3 (Ubuntu 24.04 "Noble Numbat", que es de donde Mint toma sus paquetes):
$ cat /etc/os-release | grep VERSION
VERSION="24.04.5 LTS (Noble Numbat)"
$ apt-cache policy golang-go
golang-go:
Installed: (none)
Candidate: 2:1.22~2build1
Version table:
2:1.22~2build1 500
500 http://ports.ubuntu.com/ubuntu-ports noble/main arm64 Packages
$ curl -s 'https://go.dev/VERSION?m=text'
go1.27.1
El paquete del sistema ofrece la 1.22. La versión oficial vigente, medida en el mismo instante, es la 1.27.1. Y esto no es un descuido que alguien vaya a corregir: es la política de Ubuntu y de Mint.
¿Por qué se congela así, a propósito? Ubuntu 24.04 es una versión LTS (Long Term Support): el día que sale, sus paquetes principales se congelan y solo reciben parches de seguridad, nunca versiones nuevas del programa. Es una decisión correcta para un servidor que no debe cambiar de comportamiento solo por instalar actualizaciones — pero significa que un compilador de un lenguaje que libera versiones nuevas dos veces al año se queda fijo en la que existía cuando Ubuntu 24.04 se publicó (abril de 2024), para siempre, mientras esa versión de Ubuntu exista. Linux Mint no tiene sus propios paquetes de Go: hereda literalmente los de Ubuntu, así que hereda también el congelamiento.
¿Por qué te importa a ti, concretamente? Porque vas a buscar cosas en internet, los ejemplos van a usar funciones o comportamientos que tu Go de 1.22 no tiene, y los errores no van a decir «te falta versión»: van a decir cosas que no tienen sentido para lo que estás viendo en pantalla. Es el tipo de problema que parece un error tuyo y en realidad es un desfase de herramienta — y te pasa antes de escribir tu primera línea de código, por eso esta lección existe antes que cualquier otra.
🔑 La forma correcta, y es la que recomienda el propio proyecto Go: descargar el paquete oficial
directamente de go.dev, no del gestor de paquetes de tu distribución. Eso es lo que instala esta
lección, paso por paso, y lo que vamos a comprobar en cada paso con la salida real de los comandos.
Los conceptos
1.1 Qué son GOROOT, GOPATH y por qué antes importaban más que ahora
Antes de instalar, vale la pena saber qué vas a tener después, porque los nombres GOROOT y GOPATH
aparecen en casi cualquier error de instalación que busques en internet, y muchas respuestas están
escritas para una versión de Go de hace diez años.
GOROOTes la carpeta donde vive el propio Go: el compilador,gofmt, la biblioteca estándar. Es la carpeta que vas a crear en el paso 1.4 (/usr/local/go). No la tocas nunca a mano.GOPATHes la carpeta donde Go guarda cosas tuyas: paquetes descargados de internet, y —en versiones viejas de Go, antes de 2019— también donde tenías que poner todo tu código, sin excepción, dentro de una estructura fija ($GOPATH/src/github.com/tu-usuario/tu-proyecto). Si alguna vez ves un tutorial que te pide crear esa estructura de carpetas, es de esa época.
Hoy casi no la tocas porque desde Go 1.11 (2018) existen los módulos (go.mod, que vas a crear en el
paso 1.6): tu proyecto puede vivir en cualquier carpeta, con el nombre que quieras, y Go ya no necesita
que sigas una estructura de carpetas impuesta. GOPATH sigue existiendo, pero ahora solo como caché de
paquetes descargados, no como el único lugar donde puede vivir tu código.
Compruébalo con go env, que te muestra la configuración vigente de tu instalación (esto lo puedes
correr después de instalar, en el paso 1.5):
go env GOROOT GOPATH GOBIN
En una instalación limpia, recién hecha, vas a ver algo como:
/usr/local/go
/home/tu-usuario/go
/home/tu-usuario/go/bin
Ninguna de esas tres carpetas la creaste tú a mano: la primera la crea el paso de instalación (1.4), las otras dos las decide Go solo, con valores por omisión razonables.
1.2 El PATH: qué es, y por qué "ya está instalado" no significa "ya funciona"
Cuando escribes un comando en la terminal, por ejemplo go, la terminal no sabe mágicamente dónde está
ese programa: revisa, una por una, una lista de carpetas guardada en una variable llamada PATH, y usa
el primer programa que encuentre con ese nombre. Si ninguna carpeta de la lista tiene un programa llamado
go, responde con un error — y ese error es literal, no aproximado:
$ go version
bash: go: command not found
Esto lo verifiqué en un contenedor con Go ya extraído en /usr/local/go, antes de tocar el PATH: el
programa existe en el disco, pero la terminal no lo encuentra porque no sabe dónde buscar. "Instalado"
y "en el PATH" son dos cosas distintas, y la confusión entre ambas es la fuente de casi todos los
tropiezos de esta lección.
Esto también explica por qué el mensaje cambia un poco según la terminal (zsh en vez de bash, que
verás si usas macOS para seguir el curso mientras practicas, o si cambiaste la terminal por defecto de tu
Mint):
$ go version
zsh: command not found: go
Mismo problema, mismo mecanismo, orden de palabras distinto: identifica cuál es tu caso con
echo $SHELL antes de buscar el error en internet, porque buscar el mensaje equivocado te va a llevar a
respuestas para el shell equivocado.
1.3 Averigua cuál es la última versión
No la copies de aquí: este documento envejece igual que los repositorios de Mint, y ya viste en la sección anterior cuánto le puede pesar a una herramienta quedarse fija en el tiempo.
curl -s 'https://go.dev/VERSION?m=text' | head -1
Te va a responder algo como go1.27.1. Ésa es la que vas a instalar, sea cual sea cuando tú lo hagas.
1.4 Descárgala e instálala
Sustituye go1.27.1 por lo que te dijo el comando anterior. linux-amd64 es lo correcto para una PC o
laptop normal (si tu máquina fuera ARM, sería linux-arm64; para saberlo: dpkg --print-architecture).
cd /tmp
wget https://go.dev/dl/go1.27.1.linux-amd64.tar.gz
Y ahora la instalación:
sudo rm -rf /usr/local/go # borra una instalación anterior, si había
sudo tar -C /usr/local -xzf go1.27.1.linux-amd64.tar.gz
Qué acabas de hacer, porque conviene entenderlo y no solo copiarlo:
tardescomprime el archivo.-C /usr/localle dice «hazlo dentro de esta carpeta».-xzfes «extrae» (x), «está comprimido con gzip» (z), «de este archivo» (f).- El resultado es una carpeta
/usr/local/gocon todo Go adentro — elGOROOTde la sección 1.1.
¿Por qué sudo, si nunca lo habías necesitado para instalar algo con un gestor de paquetes? Porque
/usr/local es una carpeta del sistema, no de tu usuario, y en Linux escribir ahí requiere permisos de
administrador. Sin sudo, esto es exactamente lo que vas a ver —lo provoqué a propósito, sin sudo, para
que veas el mensaje real y no uno inventado—:
$ tar -C /usr/local -xzf go1.27.1.linux-amd64.tar.gz
tar: go: Cannot mkdir: Permission denied
tar: go/VERSION: Cannot open: No such file or directory
tar: go/api: Cannot mkdir: No such file or directory
tar: go/api/README: Cannot open: No such file or directory
... (se repite, una vez por cada archivo del paquete)
No es un error, es cientos. tar intenta escribir cada archivo del paquete, uno por uno, y cada uno
falla igual porque ninguno tiene permiso de escribir en /usr/local. Si ves esta pared de líneas
repetidas, la causa es siempre la misma y siempre se arregla igual: antepón sudo.
1.5 Dile a tu sistema dónde está — y la trampa de las terminales modernas
Ahora Go existe en /usr/local/go/bin/go, pero como viste en la sección 1.2, si escribes go te va a
decir command not found: esa carpeta no está en el PATH todavía.
La instrucción que vas a ver en casi cualquier tutorial, incluida la documentación oficial de Go, es ésta:
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile
source ~/.profile
~/.profilees un archivo que, en teoría, tu sistema lee cada vez que inicias sesión.source ~/.profileaplica el cambio en esta terminal, ahora mismo, sin esperar a la próxima sesión.
Y aquí viene lo que la mayoría de los tutoriales no te dicen, y que comprobé con una prueba real: una terminal nueva no siempre es una "sesión nueva".
~/.profile solo lo lee lo que Linux llama una shell de login — la que arranca cuando inicias
sesión en el sistema (por ejemplo, al encender la máquina y entrar con tu usuario y contraseña). Pero la
mayoría de las aplicaciones de terminal (la terminal de Mint incluida, en su configuración por omisión)
al abrir una ventana o pestaña nueva no arrancan una shell de login: arrancan una shell interactiva
normal, y ésas leen otro archivo distinto, ~/.bashrc, no ~/.profile.
Lo comprobé así, simulando exactamente ese escenario —"ya edité el archivo, cierro la terminal, abro otra"— en un contenedor recién instalado:
# después de agregar el export SOLO a ~/.profile, en una terminal nueva:
$ go version
bash: go: command not found ← sigue sin funcionar
# después de agregar la MISMA línea también a ~/.bashrc, en una terminal nueva:
$ go version
go version go1.27.1 linux/arm64 ← ahora sí
La instrucción "cierra la terminal, abre otra" no siempre alcanza, y cuando no alcanza, parece que hiciste algo mal cuando en realidad seguiste el tutorial al pie de la letra. Por eso la recomendación de esta lección, más robusta que la de la mayoría de las guías, es agregar la línea a los dos archivos:
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
source ~/.bashrc
~/.profile cubre el caso de una sesión de login de verdad (por ejemplo, si usas SSH o cambias de
usuario); ~/.bashrc cubre el caso, mucho más común en el día a día, de abrir una ventana o pestaña de
terminal nueva sobre una sesión que ya estaba abierta.
💡 Si usas zsh en vez de bash (lo sabes si tu terminal se ve distinta o si te lo cambiaron), el
archivo equivalente a .bashrc es ~/.zshrc. Para saber cuál shell usas: echo $SHELL.
🔑 Cómo distinguir si tu terminal abre una shell de login, sin adivinar: corre echo $0 recién
abierta. Si la respuesta empieza con un guion (-bash, -zsh), es una shell de login y sí lee
~/.profile. Si no lleva el guion (bash, zsh), no lo es, y necesitas el cambio en ~/.bashrc (o
~/.zshrc) para que persista.
1.6 Comprueba que funcionó
go version
Debe responder algo como go version go1.27.1 linux/amd64 (o linux/arm64 si tu máquina es ARM). Si
sigue diciendo command not found, revisa con echo $0 de qué tipo de shell se trata y en qué archivo
pusiste el cambio, siguiendo la sección 1.5.
1.7 Tu primer programa
mkdir -p ~/w/curso-go/hola && cd ~/w/curso-go/hola
go mod init hola
go mod init crea un archivo go.mod. Es la ficha de identidad del proyecto: dice cómo se llama y qué
versión de Go usa. Es el mecanismo de módulos que ya mencionamos en la sección 1.1, y es el mismo con el
que vas a arrancar el proyecto revisor en la lección 5.
Crea main.go con esto:
package main
import "fmt"
func main() {
fmt.Println("hola, ya tengo Go")
}
Línea por línea, porque cada una tiene su razón:
package main |
«este archivo pertenece al paquete main». El paquete main es especial: es el único que produce un programa ejecutable. Sin esta línea tendrías una biblioteca, no un programa |
import "fmt" |
«voy a usar cosas del paquete fmt» (de format), que trae lo necesario para imprimir. Go no trae nada cargado por omisión: lo que uses, lo pides |
func main() |
la función donde empieza tu programa. Cuando lo ejecutas, Go busca exactamente esta función. Si se llama de otra forma, no arranca |
fmt.Println(...) |
imprime y salta de línea. El punto significa «la función Println que está dentro de fmt» |
Córrelo:
$ go run main.go
hola, ya tengo Go
Esa salida es real: la corrí antes de escribir esta línea.
1.8 Los comandos que vas a usar siempre — y la sutileza de go.mod
go run main.go # compila y ejecuta de una vez, sin dejar archivo. Para probar mientras trabajas
go build # crea el programa ejecutable y lo deja ahí
go fmt ./... # ordena tu código
go test ./... # corre las pruebas (lección 5)
Una sutileza real que vale la pena probar tú mismo, porque cambió entre versiones de Go: con un
programa de un solo archivo como el de arriba, go run main.go funciona incluso sin go.mod. Lo
comprobé en una carpeta nueva, sin go mod init:
$ go run main.go
hola, ya tengo Go
Pero go build, en esa misma carpeta sin go.mod, sí exige el módulo:
$ go build
go: go.mod file not found in current directory or any parent directory; see 'go help modules'
¿Por qué la diferencia? go run sobre un solo archivo puede resolverlo todo sin necesitar saber el
nombre del módulo, porque no hay nada que otro archivo pueda importar de él. En cuanto tu programa
necesita más de un archivo — por ejemplo, si intentas importar un paquete propio, como vas a hacer en la
lección 5 con el revisor — Go necesita el go.mod para saber cómo se llama tu módulo y así resolver
esos imports. Lo comprobé también:
$ go run main.go # main.go importa "hola/utilidades", sin go.mod
main.go:4:5: package hola/utilidades is not in std (/usr/local/go/src/hola/utilidades)
La lección práctica: corre go mod init siempre, desde el primer archivo, aunque go run a veces
funcione sin él — te ahorras este error exacto en cuanto tu programa necesite importar un paquete propio,
que va a pasar ya en la lección 5.
Prueba la diferencia entre run y build:
$ go build
$ ls -la
-rwxr-xr-x 1 tu-usuario tu-usuario 2341973 ... hola
$ ./hola
hola, ya tengo Go
1.9 Por qué el binario es portátil: enlazado estático
🔑 El archivo hola que produjo go build es un programa completo y autosuficiente. Y esto no hay
que creerlo de fe: lo comprobé copiando ese binario exacto, compilado en una máquina con Go instalado, a
un contenedor limpio, sin Go:
$ which go
go no esta instalado
$ ./hola
hola, ya tengo Go
Funcionó. No necesita intérprete, ni máquina virtual, ni bibliotecas externas instaladas aparte,
porque Go hace enlazado estático: en vez de decir «cuando corras, busca la biblioteca fmt en algún
lado del sistema» (que es como funcionan muchos programas en C o en Python), Go copia dentro del propio
binario todo lo que tu programa necesita para correr. El archivo pesa más por eso —poco más de 2 MB para
un programa de una línea— pero a cambio puedes copiarlo a cualquier máquina Linux compatible y va a
funcionar tal cual, sin instalar nada más.
Ésa es la característica más práctica de Go, y por eso tantas herramientas de servidores están escritas
en él — incluido el revisor que vas a compilar y publicar en la lección 7.
1.10 Un editor que te ayude
No es obligatorio, pero te va a ahorrar mucho tiempo. Si usas VS Code, instala la extensión oficial
Go (de golang.go). Medido el 30-sep-2026 en el Marketplace de Visual Studio: la versión publicada
es la 0.57.2. Ese número también va a envejecer — lo relevante es que instales la que ofrezca el
Marketplace el día que lo hagas, no que anotes este número.
La extensión te va a subrayar los errores mientras escribes, en lugar de que te enteres al compilar, y te
deja saltar a la definición de cualquier cosa con F12. La primera vez te va a pedir instalar unas
herramientas extra (gopls, el servidor de lenguaje de Go, entre otras): dile que sí a todas.
El error que vas a ver
Todos estos son mensajes reales, provocados a propósito para esta lección — no descripciones aproximadas de lo que "probablemente" dirían:
| El síntoma | Mensaje literal | Qué pasa y qué hacer |
|---|---|---|
Terminal bash sin Go en el PATH |
bash: go: command not found |
El programa no está en ninguna carpeta del PATH. Revisa la sección 1.5 |
Terminal zsh sin Go en el PATH |
zsh: command not found: go |
Mismo problema, orden de palabras distinto porque es otro shell |
tar sin sudo contra /usr/local |
tar: go: Cannot mkdir: Permission denied (repetido por archivo) |
Faltó sudo antes del comando de extracción (sección 1.4) |
Agregaste el PATH solo a ~/.profile y abriste una terminal nueva |
bash: go: command not found (persiste) |
Tu terminal no abre una shell de login; agrega la línea también a ~/.bashrc (sección 1.5) |
go build en una carpeta sin go.mod |
go: go.mod file not found in current directory or any parent directory; see 'go help modules' |
Corre go mod init <nombre> en esa carpeta |
Import de un paquete propio sin go.mod |
main.go:4:5: package hola/utilidades is not in std (...) |
Igual que el anterior: sin módulo, Go no sabe resolver tus propios paquetes |
Olvidaste import "fmt" y usaste fmt.Println |
# command-line-arguments<br>./main.go:4:2: undefined: fmt |
Go conoce todos los símbolos disponibles; si no importaste el paquete, no existe para él |
go version responde 1.22 en vez de la vigente |
(sin error, pero versión equivocada) | Se está usando el de apt. Quítalo con sudo apt remove golang-go y confirma que /usr/local/go/bin esté en tu PATH |
Y la regla general, que aplica a los ocho: copia el mensaje de error completo y búscalo tal cual, sin resumirlo con tus palabras primero. Casi siempre alguien ya lo tuvo, y el mensaje casi siempre dice exactamente qué falta — adivinar sin leerlo completo es la forma más lenta de resolverlo.
Lo que se hace mal
Instalar Go con el gestor de paquetes del sistema (
apt install golang). Es la sugerencia más común en tutoriales viejos, y es exactamente el problema de la sección "Por qué importa": una versión LTS congelada te deja años de atraso sin avisarte con ningún error, solo con comportamientos raros más adelante.Dar por hecho que "cerrar y abrir la terminal" siempre recarga la configuración. Es la trampa medida en la sección 1.5: si tu terminal no abre una shell de login, cerrarla y abrirla de nuevo no vuelve a leer
~/.profile. El síntoma —"lo hice bien y no funciona"— no significa que hiciste algo mal, significa que ese archivo no era el que tu terminal lee.Extraer la versión nueva encima de una instalación vieja, sin borrar antes. El
sudo rm -rf /usr/local/godel paso 1.4 no es decorativo: si extraes encima de una instalación vieja, quedan archivos de las dos mezclados y el resultado es un Go que falla de formas incomprensibles. Borra primero, siempre.Confiar en que
go runfunciona singo.mody por eso saltartego mod init. Es cierto para un archivo suelto (sección 1.8), pero deja de serlo en cuanto tu programa tiene más de un archivo — y para entonces ya escribiste código que vas a tener que reorganizar. Corrego mod initdesde el principio, siempre.Discutir el estilo del código a mano. En Go el estilo no se discute: lo decide la herramienta. Prueba escribir esto a propósito, todo torcido:
package main import "fmt" func main(){ fmt.Println( "hola" ) }Corre
go fmt ./...y vuelve a abrir el archivo: quedó ordenado solo. No existen las peleas sobre dónde va la llave o cuántos espacios lleva la indentación, porquegofmttiene una sola respuesta y todo el mundo la usa. Acostúmbrate a correrlo antes de guardar, en vez de formatear a mano.
Ejercicios
- Instala Go siguiendo las secciones 1.3 a 1.6 y confirma la versión con
go version. - Corre
echo $0en tu terminal antes de tocar el PATH. Según lo que responda, decide si necesitas tocar~/.profile,~/.bashrc, o los dos (sección 1.5) — y explica por qué, con tus palabras, antes de seguir. - Crea el proyecto
holade la sección 1.7, corrego run main.goy luegogo build+./hola. - (Como en la sección 1.9) Copia tu binario
holaa otra máquina Linux, o a una máquina virtual / contenedor sin Go instalado, y confirma que corre igual. - Cambia el mensaje de
fmt.Printlnpor algo tuyo, desordena la sangría a propósito, y corrego fmt ./.... Verifica que el archivo quedó bien formateado. - (Un poco más difícil) Crea una carpeta nueva, sin
go mod init, con unmain.gode un solo archivo. Confirma quego run main.gofunciona de todos modos. Después corrego builden esa misma carpeta y compara el error con el de la sección 1.8. Explica, con tus palabras, por qué uno funciona y el otro no. - (Un poco más difícil) Borra a propósito la línea
import "fmt"y corrego run main.go. Lee el error completo, sin buscarlo todavía, e intenta explicar con tus palabras qué te está diciendo antes de seguir.
Soluciones
go versiondebe imprimir la misma versión que viste encurl -s 'https://go.dev/VERSION?m=text', nuncago1.22.x(ésa es la delaptde Mint).Si
echo $0responde con guion al inicio (-bash), tu terminal abre shells de login y~/.profilebasta. Si responde sin guion (bash), no es una shell de login, y solo~/.bashrc(o~/.zshrcen zsh) va a persistir entre ventanas nuevas — agrega el cambio ahí también, como en la sección 1.5.go run main.goimprimehola, ya tengo Go. Trasgo build, aparece un archivoholaen la carpeta;./holalo ejecuta directo, sin volver a compilar.El binario corre igual en la máquina sin Go, porque Go hace enlazado estático (sección 1.9): todo lo que el programa necesita ya está copiado dentro del propio archivo.
Antes de
go fmt, el archivo se ve exactamente como se escribió (torcido). Después,gofmtlo reacomoda con la indentación y los espacios estándar de Go — sin que tú decidas nada de eso.go run main.gofunciona porque, con un solo archivo, Go no necesita resolver ningún import propio para compilarlo y ejecutarlo de una vez.go build, en cambio, exige saber el nombre del módulo desde el primer momento y respondego: go.mod file not found.... La diferencia es quebuilddeja el binario listo para usarse fuera de esa invocación puntual, y para eso necesita una identidad de proyecto —runno.El compilador responde:
# command-line-arguments ./main.go:4:5: undefined: fmtDice que usaste
fmt.Printlnsin haber importado el paquetefmt: el compilador conoce todos los símbolos que puedes usar, y si no lo importaste, no existe para él. Se arregla devolviendo la líneaimport "fmt".
Cómo sé que lo logré
-
go versionresponde con la versión que vi engo.dev/VERSION, no con 1.22. - Sé si mi terminal abre shells de login o no (
echo $0), y en qué archivo(s) puse el cambio de PATH en consecuencia. -
go run main.goimprime mi mensaje. -
go buildprodujo un archivo y./holafunciona. - Copié mi binario a otra máquina (o contenedor) sin Go y corrió igual.
- Probé
go fmtsobre código mal escrito y lo ordenó. - Provoqué el error de
go buildsingo.mody puedo explicar por quégo runno lo tuvo. - Provoqué el error de
importfaltante y entendí el mensaje sin necesitar la solución. - Puedo explicar, sin ver el texto, qué diferencia hay entre
GOROOT,GOPATHy elPATH.
Resumen
- Nunca instales Go con el gestor de paquetes del sistema (
apt install golang): las versiones LTS de Linux se congelan, y el paquete queda años atrás sin avisar con ningún error. GOROOTes dónde vive Go;GOPATHes dónde Go guarda paquetes descargados; ninguno de los dos lo tocas a mano en un proyecto moderno con módulos (go.mod).- El
PATHes la lista de carpetas donde la terminal busca programas. Tener Go instalado y tener Go en elPATHson dos cosas distintas. - Una terminal nueva no siempre es una sesión de login: la mayoría solo lee
~/.bashrc(o~/.zshrc), no~/.profile. Agrega el cambio dePATHa los dos archivos. go mod initcrea la identidad del proyecto (go.mod); todo proyecto de Go la necesita, aunquego runa veces funcione sin ella con un solo archivo.go runcompila y ejecuta sin dejar archivo;go builddeja el binario;go fmtda formato automático, sin discusión posible sobre estilo.- El binario que produce
go buildes autosuficiente por enlazado estático: corre en otra máquina Linux compatible sin tener Go instalado. - Cada mensaje de error de esta lección es literal, provocado a propósito:
command not found,Permission denied,go.mod file not found,undefined: fmt— cópialos tal cual cuando los busques.
Para leer más
- Download and install — la guía oficial de instalación, la fuente de la
verdad si algo en esta lección envejece. Incluye la misma recomendación de
~/.profileque usamos aquí, con la misma advertencia de que el cambio "puede no aplicarse hasta el siguiente inicio de sesión" — que es justo lo que se midió y se explicó a fondo en la sección 1.5. - A Tour of Go — el recorrido interactivo oficial; empieza justo donde termina esta lección.
- Effective Go — incluye la sección sobre
gofmty por qué el formato no se discute en Go. - GNU Bash — Manual: Bash Startup Files —
la referencia oficial de cuándo se lee
~/.profiley cuándo~/.bashrc; vale la pena leerla completa una sola vez en la vida, porque la confusión entre los dos no es exclusiva de Go.
Términos de esta lección
| Término | Qué significa |
|---|---|
GOROOT |
la carpeta donde vive la instalación de Go: el compilador, gofmt, la biblioteca estándar |
GOPATH |
la carpeta donde Go guarda paquetes descargados; antes de los módulos, también tenía que vivir ahí todo tu código |
PATH |
la lista de carpetas donde la terminal busca programas ejecutables |
| shell de login | la sesión de terminal que arranca al iniciar sesión en el sistema; es la única que lee ~/.profile |
go.mod |
el archivo que identifica un proyecto de Go: su nombre y la versión de Go que usa |
| binario | el archivo ejecutable que produce go build, autosuficiente, sin depender de tener Go instalado |
| enlazado estático | la técnica por la que Go copia dentro del binario todo lo que el programa necesita, en vez de buscarlo en el sistema al correr |
gofmt |
la herramienta que da formato automático al código Go, sin opciones que discutir |
Anterior: Lección 0 — Qué es Go · Siguiente: Lección 2 — Variables, funciones y tipos
¿Prefiere correo? Escríbanos a hola@habil.mx