¿Cómo es desarrollar una aplicación web en Golang?

Go es un lenguaje maravilloso para escribir servicios web, debido a sus hilos livianos, modularidad y excelente integración con otros servicios.

Como antecedentes, actualmente estoy escribiendo un servicio web en Go que se acerca a las 4000 líneas de código. Antes de comenzar a usar Go, usaba C ++ y Python para la mayoría de mis proyectos.

Goroutines
Los grandes servidores web deben ejecutar miles de tareas concurrentes.

Una de las características definitorias del lenguaje de programación Go es que
La concurrencia está integrada en el lenguaje de programación.

Goroutines, hilos livianos, permiten al desarrollador realizar múltiples funciones al mismo tiempo, como una línea de ensamblaje. Estos son muy útiles para los servidores web; por ejemplo, cuando alguien se conecta a mi servidor, acabo de generar una nueva rutina para manejar ese cliente. También es increíblemente fácil hacerlo, solo con el prefijo de una llamada a la función con la palabra clave `go`.

Soy consciente de que muchos otros idiomas admiten el subprocesamiento múltiple, pero la implementación de goroutines de Go hace que la administración de estos hilos sea increíblemente fácil.

Modularidad
Los servicios web grandes con una gran base de código deben mantenerse y mejorarse en partes discretas y organizadas.

Una de las características de Go que más disfruto es lo fácil que es desarrollar una aplicación grande al modularizar su código.

Aunque estoy escribiendo casi 4000 líneas de código Go para esta aplicación, no parece un montón de código gigante que está unido con cinta adhesiva. En cambio, se siente casi como una sinfonía, con cada función realizando su parte.

La depuración en go es muy eficiente, porque la modularidad le ayuda a saber dónde ubicar y resolver su problema. Esto se debe a que todas las declaraciones relevantes de función, constante, variable y tipo se mantienen en lugares predecibles . Aunque algunos desarrolladores que provienen de lenguajes de programación más tradicionales argumentan cómo esto podría limitar su estilo de libertad de código, en mi opinión, es mucho mejor simplemente seguir lo que funciona .

La mejor parte es que gran parte de esta organización es manejada automáticamente por la herramienta `go fmt`. Al llamar a esta herramienta en su código, formatea su código automáticamente según las especificaciones de Go acordadas: yo personalmente uso el paquete GoSublime de Sublime Text, así que esto se hace cada vez que guardo el archivo 🙂 La otra organización viene de seguir las mejores prácticas de Go en documentando su código.

Además, tengo que mencionar el sistema de compilación de paquetes de Go. En lugar de buscar en cada biblioteca importada e importar las dependencias para cada biblioteca, construye cada paquete importado en un solo ejecutable que se puede importar directamente . Para ilustrar mi punto, si está utilizando los paquetes A y B, que ambos llaman paquete C, el paquete C solo necesita construirse una vez (en lugar de que el código se importe e incorpore en cada paquete por separado). Esto permite tiempos de construcción increíblemente rápidos. Otra gran ventaja para usar Go.

Integración con software de terceros / incorporados
Los servicios web necesitan realizar una gran cantidad de funciones. No quieres escribir todo ese código tú mismo.

Afortunadamente, Go interactúa bastante bien con herramientas comunes a través de bibliotecas integradas o de terceros. Estos son los ejemplos más notables de servicios con los que interactúa mi servicio web:

Builtins

  • Bibliotecas de criptografía (RSA, AES, generación de números aleatorios con seguridad criptográfica)
  • Protocolos web seguros (TLS y SSL)
  • Servidor HTTP (¡con plantillas HTML!)

Tercero

  • MongoDB
  • Amazon S3

Afortunadamente, todas estas funcionalidades están habilitadas por bibliotecas en línea gratuitas que están completamente documentadas. Aunque puedo entender cómo algunos desarrolladores estarían preocupados por la falta de bibliotecas en Go porque todavía es un lenguaje de programación relativamente joven (lanzado en 2009), personalmente no he encontrado que esto sea un problema en absoluto.

Dado que el producto final de una aplicación Go es un ejecutable binario, puede integrarse en una amplia variedad de aplicaciones y entornos. Por ejemplo, estoy usando un binario escrito en Go como back-end para una aplicación Mac OSX que usa frameworks Cocoa.

En general, he ganado un inmenso respeto por Go, especialmente al escribir servicios web.

Estoy ejecutando y ampliando un proyecto Go de 10k líneas en producción, así que aquí están mis pensamientos.

Viniendo de Java comencé a usar algunos frameworks. Con el tiempo, estos marcos me hicieron cada vez más improductivo. Fui a usar los paquetes de red + httprouter.

Nunca sentí que fuera tan fácil mantener un gran proyecto.

Múltiples dominios, un backend (hostwitch).

Inyección de dependencia a través de la inyección de Facebook.

MySQL, Cassandra, Elasticsearch trabajando como un encanto.

Recursos integrados -> UN solo binario. (Construye una vez, despliega en todas partes)

Los certificados SSL también están integrados. (No se requieren archivos externos)

Agregar una nueva ruta es cuestión de minutos.

Codificación Json a través de easyjson, precompilado => uso de memoria rápido + bajo.

Estoy usando v8worker para renderizar la interfaz React.js sin nodo. Es dos veces más rápido que manejar http desde el nodo. Además, obtengo los datos requeridos de Go e inyecto el estado inicial directamente en el proceso de representación de reacción. Es mucho más rápido que resolver un componente Promise desde el nodo.

HTTP2 Server push funciona como una brisa. Aplicación React.JS (contenido DOM cargado en 150 ms, carga completa de la página en 500 ms).

Al principio, he creado iOS y Android de forma nativa. Pensé en reconstruir partes de las aplicaciones en react-native para acelerar el desarrollo. Sin embargo, decidí construir una biblioteca cliente para iOS y Android a través de gomobile bind.

Actualmente estoy pensando en implementar un Redux como State System in go que integre la comunicación cliente + servidor.

Entonces, ¿cómo es desarrollar en Golang? Pura genialidad.

El código Go es puro y fácil de leer. Manejar cada error puede parecer molesto al principio, pero en comparación con Java es más fácil de leer. No hay devoluciones de llamada, no intente atrapar bloques. No hay una sintaxis elegante como en Swift. ¡¿Guardia?!

Debido a v8worker puedo renderizar Javascript en el lado del servidor, así que no necesito nada más que un pequeño binario (35mb).

En resumen: Go me apoya perfectamente para hacer las cosas rápido y limpio, además es increíblemente rápido.

¿Te gusta generar mucho código en lugar de usar genéricos? ¿O tal vez le gusta escribir su código “typesafe” todo el tiempo mientras analiza JSON? Entonces Go es una excelente opción.

¿Le encanta desreferenciar los tipos de puntero al desarmar sus campos de opciones? Entonces lo disfrutarás mucho.

¿Crees que copiar o pegar el mismo error tres o cuatro veces es algo que te hace productivo? Entonces if (err != nil) es definitivamente tu amigo.

¿Odias absolutamente el espacio de nombres? Genial, Go no tiene uno.

¿Crees que todas tus estructuras de datos podrían reducirse solo a mapas y sectores? Oh, puede tener ConcurrentMap, pero tendrá una API totalmente diferente del mapa normal.

¿Te gusta adivinar si en un gran proyecto vas a escribir la interfaz correctamente?

¿Crees que vivir sin gestión de dependencia durante 7 años está totalmente bien, y tener uno que sea lento y con errores está totalmente bien? Entonces hazlo ir camino.

Entonces, ¿dónde brilla Go? Como lenguaje de sistema para alguien que no es programador de sistemas. Si necesita escribir una herramienta de línea de comandos, o algún tipo de microservicio de infraestructura, como un proxy o multiplexor, es genial. Pero para escribir lógica de negocios, hay al menos otras diez tecnologías, que son más adecuadas para eso.

nuestro backend está escrito en parte en go y es muy eficiente. En comparación con Ruby, la sintaxis es un poco más fea, pero si vienes de C ++ o Java, deberías estar acostumbrado.

Personalmente, me gusta cómo funciona nuestra aplicación Go. El enrutamiento es intuitivo y fácil de configurar. La prueba de nuestros controladores de respuesta me llevó un tiempo, pero después de comprender cómo funciona la httptest lib, fue agradable. así que eche un vistazo a la biblioteca http y pruébela

No es que esta sea una pregunta muy concreta. Estoy tentado a responder “mucha diversión, sobre todo”.

Desde mi experiencia (ya llevo un año y medio con go) la creación de una aplicación web es increíblemente rápida, al menos hasta que necesite cosas que la biblioteca estándar no tenga y necesite bibliotecas adicionales (pero las hay, por lo tanto , no es gran cosa). Esto significa que las cosas descartables que solía escribir para uso personal con alguna interfaz de línea de comandos torpe (es decir, el código que escribí para mí porque necesitaba una herramienta especial para algo) ahora escribo como una aplicación web con servicio local, que a veces es mucho más útil (depende del caso de uso)

También estoy trabajando en un gran proyecto en el trabajo usando go, y hasta ahora es genial. Mi 2 ¢.