El lenguaje de programación Go fue creado con una meta en mente, ser capaz de construir aplicaciones web escalables para grandes audiencias con un equipo grande. Esta es la razón por la cual ellos hicieron el lenguaje tan estandarizado como fuera posible, por esto razón la herramienta gofmt
y el estricto uso de las guías base del lenguaje fueron creados por el motivo de no tener dos caras en la base del desarrollo, en otros lenguajes existen guerras religiosas ¿En dónde debo colocar la llave abierta?
public static void main() {
}
or
public static void main()
{
}
O para python debo usar 4 espacios, 6 espacios o tabulación y otras preferencias de usuario.
Esto puede parecer ser un problema superficial, pero cuando la base de código crece y muchas mas personas están trabajando en la misma base de código, entonces es dificil mantener la "belleza" del código. Si usted conoce python, entonces debe ser conciente del PEP8, el cual es un conjunto de guías sobre como escribir código elegantemente. Vivimos en un mundo donde los robots pueden conducir un carro, entonces nosotros no solo debemos escribir código, debemos escribir código elegante.
Para otros lenguajes existen muchas variables cuando es hora de escribir código, cada lenguaje es bueno para su caso de uso, pero Go es un caso especial en esa superficie porque fue diseñado por una compañia la cual es sinónimo de Internet (y de la computación distribuida), tipicamente el flujo de escribir código va de Python a Java a C++ para propósitos de optimización, pero el problema es que casi todos los lenguajes de programación fueron escritos décadas atrás, cuando 1GB de almacenamiento tenía un costo mucho mas alto comparado con hoy en día, donde el costo de almacenamiento y computación se ha vuelto mas económico. Los computadores se están volviendo multinúcleo estos días y los "lenguajes viejos" no aprovechan la concuerrencia de la manera que Go lo hace, no porque esos lenguajes sean malos, simplemente porque el caso de uso no era reelevante cuando esos lenguajes evolucionaron.
Entonces para mitigar todos los problemas que Google enfrentó con las herramientas actuales, ellos escribieron un sistema de lenguaje llamado Go, ¡el cual estás a punto de aprendeer! Hay muchas ventajas para usar Golang, y también muchas desventajas, para cada moneda hay dos caras. Pero hay avances significativos en lugares donde el formato de código, desde que ellos diseñaron el lenguaje en una manera que no habrían guerrras con como darle formato al código. El código de formato de Go, escrito por cualquier persona en el mundo (asumiendo que usan gofmt
) se verá exactamente igual, ¡esto parecerá no importar hasta que trabajes en un equipo! También cuando una compañia usa revisión de código automatizada o alguna otra técnica lujosa, donde en otros lenguajes que no tienen un estándar en las reglas de formato, todo el código estará comprometido, ¡pero no en Go!
Go fue diseñado con la concurrencia en mente, por favor note que paralelismo != concurrencia. Hay un post maravilloso escrito por Bob Pike en el blog de Go, blog.golang.org, que usted encontraréa ahí y vale la pena leerlo.
Otro cambio muy importante que Go trajo a la programación y que yo personalmente amo, es le concepto de GOPATH
, los tiempos donde tenías que crear una carpeta llamada code y entonces crear espacios de trabajo para eclipse y otros. Ahora usted puede tener un árbol de carpetas para el código en Go y se mantendrá actualizado automáticamente por el administrador de paquetes. También bajo el código que estamos recomendando crear carpetas con cada dominio específico o el dominio de github, por ejemplo yo creé un manejador de tareas usando Go, entonces creé un conjunto de carpetas
~/go/src/github.com/thewhitetulip/Tasks
Nota: En sistemas * nix ~
se refiere al directorio del usuario, que en windows es equivalente a C:\\Users\\username
Ahora el ~/go/
es el universo de código Go en su máquina, este es solo una significante mejora en comparación con otros lenguajes, entonces podemos almacenar código eficientemente sin molestias, esto puede parecer raro al comienzo pero tiene un montón de sentido a comparación de los nombres de paquete en otros lenguajes que usan sistemas como el del dominio inverso.
Nota: junto con el src, existen dos carpetas adicionales, que son el pkg
y el bin
que es para los archivos binarios.
Estas ventajas de GOPATH
no están restringidas a guardar código en una carpeta particular, pero cuando tu tienes creado 5 paquetes para tu proyecto entonces tu no vas a tener tiempo de importarlos como import ./db
, usted puede escribir import "github.com/thewhitetulip/Tasks/db"
, entonces esto hará un go get
a mi repositorio y la herramienta go
encontrará el paquete de github.com/...
si no estaba descargado inicialmente, eso estandariza un montón de cosas en la disciplina de la programación.
Algunos se quejan que los creadores de go han ignorado toda la investigación de lenguajes hecha los pasados 30 años, bueno, esto puede ser verdad, pero de nuevo, no puedes crear un lenguaje que todo mundo ame, siempre hay alguna u otra causa o restricción que hace a los creadores considerar, y considerando todas las ventajas al menos para el desarrollo web, yo no creo que algún lenguaje se acerque tanto a las ventajas que ha alcanzado Go
, incluso si ignoras todo lo que he dicho arriba, Go es un lenguaje compilado, lo que significa que en producción no vas a tener que configurar un JVM
o un virtualenv
, ¡solo vas a tener un estático binario! y como un cubo de hielo en un pastel, todas las librerías modernas están en la librería estándar, como http
, lo cual es una ventaja mayor, es la razón principal por la que puedes crear aplicaciones web en Go sin tener que usar un framework de terceros.
Antes de comenzar a contruir una aplicación en Go, necesitamos aprender como escribir un simple programa. No puedes esperar construir un edificio sin saber como construir sus fundamentos. Por esta razón, vamos a aprender la sintaxis básica para correr algunos programas en esta sección.
De acuerdo con la prácica internacional, antes de que tú puedas construir en algún lenguaje, querrás escribir un programa que imprima "Hola Mundo".
¿Estamos listos? ¡Empecemos!
package main
import "fmt"
func main() {
fmt.Printf("Hola, mundo o 你好,世界 o καλημ ́ρα κóσμ o こんにちは世界\n")
}
Esto imprime la siguiente información.
Hola, mundo o 你好,世界 o καλημ ́ρα κóσμ o こんにちは世界
Una cosa que deberías tener en cuanta, es que los programas en Go están compuestos por package
s o paquetes.
package <nombreDelPaquete>
(En este caso es package main
) nos dice que el archivo pertenece al paquete main
y la palabra main nos dice que este paquete será compilado a un programa en vez de a un archivo cuya extensión es .a
.
Cada programa ejecutable tendrá un solo paquete main
y una única función de entrada llamada main
sin ningún argumento de entrada o salida en el paquete main
.
En orden de imprimir Hola, mundo ...
llamamos a una función llamada Printf
. Esta funcieon viene del paquete fmt
, entonces importamos este paquete en la tercera línea de código, que es import "fmt"
La manera de pensar sobre estos paquetes es similar a Python, y hay muchas otras ventajas: Modularidad (dividir tu programa en muchos módulos) y reusabilidad (cada módulo puede ser reusado en muchos programas). Nosotros solo hemos hablado sobre los conceptos relacionado con los paquetes, y luego daremos un paseo por nuestros propios paquetes, después.
En la quinta línea, usamos la palabra reservada func
para definir la función main
. El cuerpo de la función está dentro de {}
, como en C, C++ o Java.
Como puedes ver, no hay argumentos. Aprenderemos como escribir una función con argumentos en un segundo, y también hay funciones que no retornan nada o que retornan muchos valores.
En la sexta lína, llamamos la funcieon Printf
la cual pertenece al paquete fmt
. Esta fue llamada por la sintaxis <nombreDelPaquete>.<nombreDeLaFunción>
, que es mucho el estilo de Python.
Como mencionamos en el capítulo 1, el nombre de paquete y el nombre de la carpeta que contiene el archivo puede ser diferente. Aquí el nombreDelPaquete
viene del nombre en package <nombreDelPaquete>
, no del nombre de la carpeta.
Usted se puede dar cuenta que el ejemplo de arriba contiene caracteres no ASCII. El propósito de mostrar esto es para decir que Go soporta UTF-8 por defecto. Usted puede usar cualquier caracter UTF-8 en sus programas.
Cada archivo en Go está en algún paquete, y el paquete debería estar en una carpeta distinta en el GOPATH, pero el paquete main
no requiere estar en una carpeta llamada main
. ¡Este es un aspecto que ellos dejaron fuera de la estandarización! Pero si usted escoge crear una carpeta llamada main, tiene que asegurarse de ejecutar el binario correctamente. Un programa en go no puede tener mas de 1 archivo main.
~/go/src/github.com/thewhitetulip/Tasks/main $ go build
~/go/src/github.com/thewhitetulip/Tasks $ ./main/main
El detalle aquí es que cuando está usando algun archivo estático o algo mas, entonces vas a tener que ejecutar el archivo desde la raiz de la aplicación, como se ve en la segunda línea de arriba. Estoy ejecutando el binario main
fuera del paquete main, en algún momento notarás que nuestra aplicación no está funcionando de la manera que queremos, por esta razón, para evitar problemas, mantenga esto en mente.
Una cosa que usted puede notar es que Go no usa punto y comas para terminar una sentencia, bueno, si lo hace, solo que el usuario no tiene que preocuparse por colocar los punto y comas, el compilador agregas los punto y comas al final del gocode, por esta razón esto es un error de sintaxis
func main ()
{
}
porque el compilador coloca un punto y coma al final de main()
lo cual es un error de sintaxis , y esto ayuda a evitar guerras religiosas. Espero que combinen vim
y emacs
y creen un editor universal que nos ayude a evitarnos mas guerras, pero por ahora vamos a concentrarnos en aprender Go.
Go usa package
(como lo módulos en Python) para organizar los programas. La función main.main()
(esta funcieon debe estar en el paquete main
) es el punto de entrada de cualquier programa. Go estandariza el lenguaje y la mayoría de la metodología de programación, ahorrándole tiempo a los desarrolladores que se pierden en guerras religiosas. Solo puede existir un paquete main y solo una función main dentro del paquete main de Go. Go soporta caracteres UTF-8 porque uno de los creadores de Go es el creador de UTF-8, así que Go soporta múltiples lenguajes desde el momento en que nació.
- Índice
- Sección anterior: Go, Conocimiento básico
- Siguiente sección: Fundamentos de Go