¿Qué tan popular es el idioma Go? Países extranjeros como Google, AWS, Cloudflare, CoreOS, etc., y empresas nacionales como Qiniu y Alibaba han comenzado a utilizar el lenguaje Go para desarrollar sus productos relacionados con la computación en la nube a gran escala. ¿A qué Sí y Peros debería prestar atención al usar el lenguaje Go? Recientemente, escribimos una API usando el lenguaje Go, un lenguaje de programación de código abierto lanzado por Google en 2009. En el proceso de usar Go para el desarrollo, hemos adquirido mucha experiencia y experiencia, y queremos compartirla con los lectores, así que tenemos este artículo.
Al elegir un lenguaje de programación para un proyecto, siempre recomendamos entender en qué se construirá el proyecto antes de considerar en qué lenguaje de programación construir. Que el producto sea el factor decisivo en cómo debe construirse.
Aquí tienes algunos de los pros y contras que hemos encontrado al desarrollar con Go para ayudarte a entender si es adecuado para tu próximo proyecto.
Lo que nos encanta de Go
El uso del idioma Go ha explotado en los últimos años. Parece que todas las startups lo usan para sistemas backend. Hay muchas razones por las que los desarrolladores lo consideran tan popular.
El idioma Go es muy rápido
Go es un lenguaje de programación muy rápido. Como Go se compila en código máquina, naturalmente supera a los lenguajes de programación que son interpretativos o que tienen un entorno de ejecución virtual. Los programas de Go también compilan muy rápido y producen binarios muy pequeños. Nuestra API se compila en solo unos segundos, resultando en un archivo ejecutable tan pequeño como 11,5MB.
Fácil de dominar
La sintaxis del lenguaje Go es sencilla y fácil de entender en comparación con otros lenguajes. Puedes memorizar la mayor parte de la sintaxis del Go en tu cabeza, lo que significa que no tienes que pasar mucho tiempo buscando cosas. El idioma del go también es muy limpio y fácil de leer. Los programadores que no son Go, especialmente aquellos acostumbrados a la sintaxis estilo C, pueden leer el código del programa Go y entender lo que está ocurriendo.
Lenguaje de definición de tipos estático
Go es un lenguaje estático potente que define tipos. Hay tipos básicos como int, byte y cadena. También hay tipos de estructuras. Como en cualquier lenguaje fuertemente tipado, el sistema de tipos permite al compilador ayudar a detectar errores para toda la clase. El lenguaje Go también tiene listas y tipos de mapeo integrados, y además son fáciles de usar.
Tipo de interfaz
El lenguaje Go tiene tipos de interfaz, y cualquier estructura puede simplemente satisfacer una interfaz implementando la interfaz. Esto te permite desacoplar dependencias en tu código. Entonces puedes simular tus dependencias en tus pruebas. Usando interfaces, puedes escribir código más modular y probable. El lenguaje Go también cuenta con funciones de primera clase, lo que permite a los desarrolladores escribir código de forma más práctica.
Biblioteca estándar
El lenguaje Go tiene una biblioteca estándar bastante buena. Proporciona funciones integradas convenientes para manejar tipos básicos. Algunos paquetes facilitan la construcción de un servidor web, la gestión de E/S, el uso de cifrado y la manipulación de bytes en bruto. La serialización y deserialización JSON proporcionada por la biblioteca estándar es muy sencilla. Usando "tags", puedes especificar el nombre del campo JSON junto al campo struct.
Soporte para pruebas
El soporte para pruebas está integrado en la biblioteca estándar y no requiere dependencias adicionales. Si tienes un archivo llamado thing.go, escribe tests en otro archivo llamado thing_test.go y ejecuta "go test". Go realizará estas pruebas rápidamente.
Herramientas de análisis estático
Las herramientas de análisis estático para el lenguaje Go son numerosas y potentes. Una herramienta en particular es gofmt, que formatea el código según el estilo sugerido por Go. Esto puede normalizar muchas de las opiniones del proyecto, permitiendo que el responsable del premio del equipo se centre en el trabajo realizado por el código. Usamos gofmt, golint y vet en cada build, y si encontramos alguna advertencia, la build falla.
Recogida de basura
Al diseñar el lenguaje Go, la gestión de memoria fue intencionadamente diseñada para ser más sencilla que C y C++. El objetivo de la asignación dinámica es la recogida de basura. El lenguaje Go hace que el uso de punteros sea más seguro porque no permite operaciones con puntero. También se ofrece la opción de usar tipos de valor.
Modelo de concurrencia más sencillo
Aunque la programación concurrente nunca es fácil, Go es más fácil de programar simultáneamente que otros lenguajes. Crear un hilo ligero llamado "goroutine" y comunicarse con él mediante "canal" es casi una tarea sencilla, pero es posible para modelos más complejos.
Lo que no nos gusta de Go
Como comentamos antes, el Go es realmente un idioma excelente. Tiene una sintaxis limpia y es rápido de ejecutar. También tiene muchas vantaxes. Pero el conjunto de un lenguaje de programación no se refiere solo a su sintaxis. Aquí están algunos de los problemas que encontramos.
No hay genéricos
Primero, este problema, como un elefante en una habitación, es un hecho obvio y pasado por alto. No hay genéricos en el idioma Go. Para los desarrolladores de lenguajes como Java, cambiar a Go es un gran obstáculo a superar. Esto significa que el nivel de reutilización del código se reduce. Aunque el lenguaje Go tiene funciones de primera clase, si escribes funciones como "mapear", "reducir" y "filter", que están diseñadas para operar sobre un tipo de colección, no puedes reutilizar estas funciones para otros tipos diferentes de colecciones. Hay muchas formas de resolver este problema, pero todas acaban escribiendo más código, lo que reduce la productividad y la mantenimiento.
La interfaz es implícita
Aunque está bien tener interfaces, la estructura las implementa de forma implícita en lugar de explícita. Se dice que esta es una de las fortalezas del lenguaje Go, pero nos resultó difícil saber por la estructura si implementaba interfaces o no. Solo puedes entender realmente intentando compilar el programa. Si el programa es pequeño, desde luego no hay nada de malo en ello. Pero si este programa es de escala media o grande, el problema es grande.
Pobre apoyo bibliotecario
El soporte de la biblioteca de Go es desigual. Nuestra API se integra con Contentful, pero este último no tiene un SDK de Go oficialmente soportado. Esto significa que tenemos que escribir (¡y mantener!) Hay mucho código para solicitar y analizar datos en Contentful. También tenemos que depender de bibliotecas de terceros de Elasticsearch. Los SDK de Go proporcionados por los proveedores no son tan populares como sus equivalentes en Java, Ruby o JavaScript.
La comunicación comunitaria es difícil
La comunidad de Go puede no aceptar sugerencias. Considera esto en el repositorio de GitHub de golint:El inicio de sesión del hipervínculo es visible., un usuario solicitó que Golint pudiera fallar la compilación cuando encontrara una advertencia (que es lo que hacemos en el proyecto). Los defensores descartaron inmediatamente la idea. Sin embargo, como demasiada gente comentó el problema, tras un año, los mantenedores finalmente tuvieron que añadir las características solicitadas.
A la comunidad de Go tampoco parece gustarle los frameworks web. Aunque la biblioteca HTTP del lenguaje Go cubre muchos aspectos, no soporta parámetros de camino, comprobación de entrada ni validación, ni tampoco preocupaciones transversales comunes en aplicaciones web. Los desarrolladores de Ruby tienen Rails, los de Java tienen Spring MVC y los de Python tienen Django. Pero muchos desarrolladores de Go optan por evitar usar frameworks. Sin embargo, la realidad es que no existen marcos de referencia, al contrario, hay muchos. Pero una vez que empiezas a usar un marco para un proyecto, es casi imposible evitar el destino del abandono.
Gestión fragmentada de dependencias
Durante mucho tiempo, el lenguaje Go no tuvo un gestor de paquetes estable y formal. Tras años de suplicas comunitarias, el proyecto Go lanzó godep hace poco. Antes de eso, ya existían muchas herramientas para cubrir ese vacío. Usamos un Govendor muy potente en nuestro proyecto, pero esto significa que la comunidad está dividida, lo que puede ser muy confuso para los desarrolladores que son nuevos en el lenguaje Go. Además, casi todos los gestores de paquetes están alimentados por repositorios Git, y el historial de los repositorios de Git puede cambiar en cualquier momento. Compáralo con Maven Central, que nunca elimina ni cambia las librerías de las que depende tu proyecto.
Decide si usar Go o no
A veces, hay que pensar en la máquina. Cuando envías y recibes bytes. Cuando gestionas miles de procesos concurrentes. También puedes estar escribiendo un sistema operativo, un sistema de contenedores o un nodo blockchain. En estos casos, lo más probable es que no te importen los genéricos. Porque estás ocupado exprimiendo rendimiento por nanosegundo del chip.
Sin embargo, muchas veces hay que pensar en los humanos. Datos de área de negocio con los que necesitas trabajar: clientes, empleados, productos, pedidos. Necesitas escribir la lógica de negocio que opera sobre estas entidades de dominio, y mantener esa lógica de negocio durante muchos años. Y debe adaptarse a las necesidades cambiantes, y cuanto antes, mejor. En estos casos, la experiencia del promotor es importante.
Go es un lenguaje de programación que valora el tiempo máquina más que el tiempo humano. A veces, en tu campo, el rendimiento de la máquina o del programa es lo más crítico. En estos casos, Go puede ser una buena alternativa a C o C++. Pero cuando escribes una aplicación típica de n niveles, a menudo surgen cuellos de botella en la base de datos y, más importante aún, en cómo vas a modelar los datos.
Al decidir si usar el lenguaje Go, ten en cuenta las siguientes reglas generales:
- Si trabajas con bytes, entonces el lenguaje Go podría ser una buena opción.
- Si trabajas con datos, entonces el lenguaje Go puede no ser una buena opción.
Esto puede cambiar algún día en el futuro. El idioma y la comunidad go aún son jóvenes. Pueden sorprendernos con la adición de genéricos; O un framework web popular ganará mucho. Sin embargo, por ahora, nos mantendremos con lenguajes de programación maduros con soporte universal, gestión de dependencias madura y un enfoque en el modelado de dominios de negocio.
|