Tutorial de Go: Empiece a utilizar Google Go

¿Por qué querrías usar el idioma Go? Básicamente, es un lenguaje compilado conciso, simple, seguro y rápido con maravillosas características de concurrencia, y maneja fácilmente proyectos grandes. También es de código abierto gratuito, a pesar de que fue desarrollado originalmente en Google.

Según Rob Pike, uno de los diseñadores del lenguaje, “los objetivos del proyecto Go eran eliminar la lentitud y la torpeza del desarrollo de software en Google y, por lo tanto, hacer que el proceso sea más productivo y escalable. El lenguaje fue diseñado por y para personas que escriben, leen, depuran y mantienen grandes sistemas de software ".

De acuerdo con esos objetivos, Go carece de muchas características de algunos otros lenguajes destacados, y eso es realmente una fortaleza. Go no está orientado a objetos, no tiene archivos de encabezado ni declaraciones de reenvío, no tiene una jerarquía de tipos, no tiene sobrecarga de métodos u operadores, no tiene genéricos, no tiene un máquina virtual para un tiempo de ejecución, no tiene excepciones y no tiene aserciones.

Por otro lado, lo que tiene Go funciona bastante bien. Puede compilar grandes programas en pocos segundos. Tiene corrutinas de baja sobrecarga (llamadas gorutinas ) que pueden comunicarse de manera eficiente a través de canales . Tiene interfaces y composición de interfaces. Además, Go admite funciones de primera clase, funciones de orden superior, tipos de funciones definidas por el usuario, literales de función, cierres y múltiples valores de retorno; en otras palabras, admite un estilo de programación funcional en un lenguaje fuertemente tipado.

Si te mueres por solicitar alguna de las funciones que faltan que mencioné anteriormente, es posible que desees leer la discusión sobre los cambios de idioma en las preguntas frecuentes sobre el idioma de Go: la respuesta suele ser "No, porque ...". diseñado desde cero para utilizar las funciones del lenguaje Go, en lugar de traducirlo literalmente de otros idiomas que utilizan diferentes abstracciones.

Instalar Go

Las breves instrucciones para instalar Go aparecen en el repositorio de origen. Puede descargar versiones binarias de Go para Windows, MacOS y Linux o instalar Go desde la fuente. Encontrará instrucciones para instalar Go desde la fuente en GitHub.

Si ya tiene Go instalado, debe verificar la versión de compilación actual en la parte inferior de //golang.org/ y luego verificar su versión instalada desde la línea de comando:

$ go versión

Si su instalación no está actualizada, descargue e instale la versión actual. Reinicie cualquier indicador de comando abierto (Windows) o terminales. Vuelva a ejecutar go versiony asegúrese de que la versión sea la que esperaba; de lo contrario, es posible que haya una versión anterior de Go instalada en otro lugar que deba eliminarse.

(No, no soy paranoico. Me las arreglé para meterme en la situación que describí usando Homebrew para instalar una versión y el paquete estándar de MacOS para instalar la próxima versión un mes más tarde. Se instalan en diferentes ubicaciones en el $PATH. Una vez que descubrí lo que había sucedido, pude desinstalar la versión anterior con Homebrew).

Otra opción de instalación, si desea soporte e indemnización y puede pagar, es usar ActiveGo.

Una vez que tenga el compilador y las herramientas de Go instalados, debe realizar el ejercicio de compilación y ejecución de un programa de Go, como se describe en la sección "Probar su instalación" de la página de instalación.

Configura tu entorno Go

Ir programadores normalmente conservan todo el código en un espacio de trabajo, con bin, pkgy srccarpetas. Dentro de cada carpeta, los proyectos suelen tener rutas que se relacionan con los repositorios de Git, como GitHub o GitLab. Por ejemplo, guardo todo mi código de idioma de Go ~/worky establezco mi GOPATHvariable de entorno en $HOME/work. La ruta a mi carpeta de código fuente "hello.go" es $GOPATH/src/github.com/meheller/hello.

También agrego el GOPATH/bindirectorio a mi ruta, para mayor comodidad al ejecutar programas Go desde cualquier directorio:

exportar GOPATH = $ CASA / trabajo

export PATH = $ PATH: $ (go env GOPATH) / bin

Las utilidades de idioma de Go se instalarán GOPATHde forma predeterminada, por lo que colocar el GOPATH/bindirectorio en la ruta también facilita que usted y los editores e IDE compatibles con Go puedan encontrarlos. Puede instalar la mayoría de las utilidades $go get una vez que sepa cuáles necesita y sus rutas de repositorio. Los repositorios suelen ser fáciles de encontrar con una búsqueda en Google. En algunos casos, un complemento de editor para Go instalará las utilidades (p gocode. Ej. ) Automáticamente.

Si no lo configura usted mismo, el valor GOPATHpredeterminado es $HOME/goen Unix y MacOS y %USERPROFILE%/goen Windows.

Ir a herramientas de idiomas, editores e IDE

Varias utilidades de Go se instalan como parte del paquete con el compilador. Otros se pueden instalar con el go getcomando. Las utilidades de línea de comandos de Go más utilizadas se enumeran a continuación.

 
Nombre Sinopsis
go Administra el código fuente de Go y ejecuta los otros comandos enumerados aquí.
cgo Habilita la creación de paquetes Go que llaman al código C.
cover Un programa para la creación y análisis de los perfiles de cobertura generados por go test -coverprofile.
fix Encuentra programas de Go que usan características antiguas del lenguaje y bibliotecas y las reescribe para usar otras más nuevas.
fmt Formatos de paquetes Go. También disponible como gofmtcomando independiente con opciones más generales.
godoc Extrae y genera documentación para paquetes Go.
vet Examina el código fuente de Go e informa sobre construcciones sospechosas, como Printfllamadas cuyos argumentos no se alinean con la cadena de formato.

La forma habitual de llamar a la mayoría de estos comandos es como subcomandos de go, por ejemplo go fmt. Otros necesitan ser llamados a través del go toolsubcomando. En mi instalación, go tooldevuelve la siguiente lista de herramientas conocidas:

$ go herramienta

addr2line

asm

buildid

cgo

compilar

cubrir

dist

Doc

reparar

enlace

Nuevo Méjico

objdump

paquete

pprof

test2json

excursión

rastro

veterinario

Estas herramientas están documentadas como parte de la lista completa de comandos Go. Por cierto, asegúrese de que GOPATHesté configurado antes de agregar cualquier herramienta de Go o cualquier complemento de editor de Go que utilice herramientas de Go.

El repositorio de Go no tiene ningún editor o soporte IDE desde la versión 1.4, pero hay muchos que conocen Go, ya sea listo para usar o con módulos complementarios. Hablé de muchos de estos en un artículo de 2017; También hay una lista no oficial mantenida por la comunidad de Golang.

Mis IDE de idioma Go favoritos son GoLand (que se muestra arriba; renombrado de Gogland desde que escribí el artículo en 2017) y Komodo. Ambos son productos de pago con pruebas gratuitas.

Querrá instalar la depuración de Delve for Go. En MacOS, es posible que también deba agregar las utilidades de la línea de comandos a Xcode, y posiblemente agregar un enlace suave a debugserver, como se describe en el comentario del 5 de junio en la lista de problemas de Delve. La ejecución xcode-select --installtambién solucionará los problemas relacionados con la búsqueda debugserver, aunque de manera de fuerza bruta.

Mis editores favoritos con interfaz gráfica de usuario compatibles con Go son Atom y Visual Studio Code; ambos son gratis. Si elige Atom, considere agregar los paquetes go-plus y go-debug; si elige Visual Studio Code, considere agregar vscode-go.

Si eres un usuario incondicional de Vim o Emacs, entonces quédate con lo que sabes, no es que yo pueda siquiera arrancar a tu editor de tus frías y muertas manos. Vim-go agrega soporte de idioma Go para Vim, y go-mode agrega soporte de idioma Go para Emacs.

Un recorrido por Go

Puede aprender bastante si realiza un recorrido por el camino, ya sea en línea o sin conexión. Suponiendo que completó la instalación local del compilador y las herramientas de Go, puede instalar el recorrido para que se ejecute localmente ejecutando estos dos comandos:

$ ve a golang.org/x/tour/gotour

$ gotour

La segunda línea debería iniciar un servidor web y abrir una ventana del navegador. Esto se verá exactamente como el recorrido en línea, pero podría ejecutarse un poco más rápido porque compila y ejecuta los ejemplos de código en su propia máquina. Presione Ctrl-C en la ventana de comandos para detener el servidor cuando haya terminado.

El recorrido se divide en tres secciones. Quiero que repase todo el recorrido, incluidos los cuestionarios, pero resumiré cada sección a continuación como una descripción general y le haré algunas preguntas. Proporciono las respuestas a mis preguntas al final del artículo (¡sin mirar!). 

Ir a lo básico del idioma

Ir a lo básico Lección 1

Pregunta 1. En este ejemplo, hay tres paquetes. ¿Qué son y cómo se utilizan? ¿Por qué el programa siempre devuelve el mismo número aunque haya una randfunción?

Tenga en cuenta que no he mencionado la Lección 2. No se salte las lecciones solo porque no las he comentado.

Go Basics Lección 3

Si ejecuta este ejemplo, verá mensajes de error:

prog.go: 9: 14: no se puede hacer referencia a un nombre no exportado math.pi

prog.go: 9: 14: undefined: math.pi

Pregunta 2. ¿Por qué los errores? ¿Cómo puedes arreglar el programa?

Go Basics Lección 4

Pregunta 3. Compare esta declaración con el equivalente en C. ¿Qué es diferente?

Go Basics Lección 8

Pregunta 4. ¿Por qué este programa no arroja ningún error?

Go Basics Lección 10

Pregunta 5. ¿De qué tipo es k? ¿Por qué? Si el tipo no es obvio, consulte la Lección 11 para saber cómo mostrarlo.

Go Basics Lección 12

Esta lección responde a la pregunta que hice en la lección 8.

Ir a la lección 1 de control de flujo

Pregunta 6. ¿En qué se diferencia del forbucle en su idioma favorito? ¿Crees que las otras construcciones de bucle en tu idioma favorito son necesarias? ¿La información adicional en las próximas tres lecciones le cambia de opinión?

Ir a la lección 7 de control de flujo

Antes de ejecutar este programa, revíselo en su escritorio y escriba lo que cree que imprimirá. Ejecuta el programa. ¿Estabas en lo correcto? Si no, ¿qué no entendiste?

Ir a la lección 8 de control de flujo

Este es el tipo de ejercicio que puede realizar al comienzo de una entrevista de pizarra. Mida el tiempo mientras lo resuelve. Di lo que estás pensando mientras resuelves el problema.

Pregunta 7. Es importante comprender el resto de la sección de control de flujo. Después de pasar por las lecciones 9 a 13, explique las declaraciones Go switchy deferde una manera que un programador de C, Java o JavaScript pueda asimilar.

Ir a más tipos Lección 1

Antes de ejecutar este programa, revíselo en su escritorio y escriba lo que cree que imprimirá. Ejecuta el programa. ¿Estabas en lo correcto? Si no, ¿qué no entendiste?

¿Qué opina de que Go tenga punteros pero no aritmética de punteros?

Trabaje en la sección Más tipos hasta llegar al ejercicio de la Lección 18. Pregunta 8. ¿Qué aprendió sobre las matrices y los cortes de Go? Ahora completa el ejercicio.

Continúe con el ejercicio de la Lección 23.

Pregunta 9. Explica un Go map. ¿Por qué querrías usar uno?

Termina la sección Más tipos.

Pregunta 10. ¿Se puede utilizar Go como un lenguaje de programación funcional, a pesar de estar compilado? ¿Cuándo y por qué usarías cierres?

Ir a métodos e interfaces

Repase las 25 lecciones de esta sección comenzando con //tour.golang.org/methods/1.

Pregunta 11. Cuando haya terminado, explique en qué se diferencia el uso de métodos e interfaces por parte de Go de las clases de C ++. ¿Cuál te gusta más? ¿Por qué?

Ir a la concurrencia

La goroutine es una de las características definitorias de Go para la concurrencia. En la primera lección de la sección de simultaneidad, intente verificar el programa (abajo) y anote lo que cree que imprimirá.

Ejecuta el programa. ¿Estabas en lo correcto? Explique lo que sucede realmente y por qué.

Los canales son la forma de sincronizar implícitamente goroutines. En la siguiente lección (a continuación), vuelva a intentar comprobar el programa antes de ejecutarlo.

Pregunta 12. ¿Por qué hay un solo canal en este ejemplo, aunque hay dos llamadas goroutine?

La instrucción de selección permite que una rutina espere en múltiples operaciones de comunicación. ¿Cuál es el orden en el que se ejecutan las declaraciones en el programa siguiente?

El ejercicio sobre árboles binarios equivalentes es otro que puede encontrar en una entrevista de pizarra. Tome el tiempo y explique su pensamiento mientras implementa una solución. Del mismo modo, realice el ejercicio sobre la implementación de un rastreador web como si estuviera en una entrevista.

Respuestas a las preguntas de Go

Respuesta 1. Los paquetes se designan por la packagedeclaración del programa actual y por la importdeclaración de los paquetes externos que se utilizan. En este programa simple, maines el propio paquete del programa, y ​​se está importando fmtpara que pueda imprimir y math/ randpara que pueda generar un número aleatorio.

Los diversos métodos se randbasan en la hora del reloj para generar números aleatorios, pero la hora se fija en el gotourentorno. Como ejercicio de seguimiento, busque el paquete y el método que informa la hora (pista: mire aquí si se atasca) y utilícelo para imprimir la hora actual. Ejecute esto varias veces en el gotourentorno y también compile el programa localmente y ejecútelo varias veces en su propia máquina.

Respuesta 2. Las exportaciones en Go siempre deben escribirse en mayúscula y el idioma distingue entre mayúsculas y minúsculas. math.Pies el método correcto.

Respuesta 3. En C / C ++, las declaraciones de variables siguen la forma (p int i, j, k;. Ej. ), Mientras que en Go el tipo va después del nombre de la variable y se puede omitir siempre que se pueda inferir el tipo. En C / C ++, el tipo de retorno precede al nombre de una función, mientras que en Go viene después de la lista de parámetros de la función y antes del cuerpo de la función. En C / C ++, los puntos y comas finales son obligatorios.

Respuesta 4. No arroja errores porque las variables Go que no están configuradas de otra manera se inicializan al valor cero del tipo, por ejemplo, 0o false. En C / C ++, el compilador marca las variables no inicializadas.

La respuesta 5.k es un número entero, porque se inicializó en 3.