¿Cuál es su opinión sobre Go (lenguaje de programación)?

★★★★★ Empecé a trabajar con Go hace casi un año en Moovweb y no he parado. Se ha convertido rápidamente en mi lenguaje compilado favorito, utilizándolo constantemente no solo para el trabajo, sino también para proyectos personales. También se convirtió en el idioma elegido por Moovweb para toda nuestra infraestructura de back-end.

Antes de Go, el lenguaje con el que me había sentido más cómodo (y había estado trabajando durante casi una década) era Java. Tengo mucha experiencia con C, SML, Ruby y Python, pero si me dieran una opción, elegiría Java. Pero realmente nunca lo elegí por amor, sino más bien por familiaridad. Nos enseñaron Java en la escuela secundaria y la universidad, mi primer trabajo fue todo Java. Sin embargo, a lo largo de mi carrera, en todo caso, siempre tuve cosas negativas que decir sobre el idioma, principalmente debido a todas mis frustraciones con él.

Ingresa Ir.

Cuando me uní a Moovweb por primera vez, me dejaron en un mar de código Go. Intimidante al principio, pero me sorprendió lo fácil que eran las cosas. Rápidamente me di cuenta de que podía escribir cosas de la forma en que normalmente las escribiría en C y, en su mayor parte, sería bastante correcto que el compilador me ayudara en el camino con las bajas sintácticas.

Según mi experiencia hasta el momento, Go es una poderosa combinación de programación de bajo nivel (piense en C) con algunos aspectos de lenguajes de programación funcionales (por ejemplo, Lisp / Haskell), como la recolección de basura, funciones como ciudadanos de primera clase y canales de concurrencia. Los usuarios de Python también encontrarán ciertas acciones familiares dado el azúcar sintáctico similar de Go (sin embargo, sigue siendo fuertemente tipado).

Una cosa que Go no tiene y que ocasionalmente escucho que la gente se pregunte es la programación orientada a objetos. Según tengo entendido (y así comienza mi especulación), el objetivo de Go era tener un lenguaje algo más limpio para escribir software de red. Por lo tanto, los desafíos se plantearon en consecuencia: 1) debe compilar el ensamblaje de la manera más limpia posible para que sea lo más eficiente posible, y 2) debe tener una forma muy limpia de manejar la concurrencia. Entonces, si nos concentramos en esos problemas, puede ver (al menos para mí) por qué el diseño orientado a objetos quedó en segundo plano.

Pero obviamente, el lenguaje evolucionó rápidamente más allá de eso. Se desarrolló una comunidad fuerte (pago rápido en IRC y Grupos de Google), y el lenguaje comenzó a ganar impulso. Algunas empresas emergentes (generalmente las primeras en probar cosas nuevas) adoptaron el lenguaje para algunos de sus proyectos. Me alegró descubrir que Moovweb fue el primero en declarar que ejecutamos Go en producción.

En Moovweb, decidimos ir con Go porque vimos muchas promesas en él. Nuestro producto depende en gran medida de hacer las solicitudes de red lo más rápido posible. También proporcionamos a nuestros usuarios un SDK que pueden usar localmente para simular su proyecto antes de enviarlo a nuestros servidores. Queríamos asegurarnos de que la experiencia de ejecutar localmente con el SDK y de nuestros servidores de producción fuera lo más idéntica posible. Sin embargo, también queríamos proporcionar nuestro SDK en todas las plataformas (Windows, Linux y Mac). Windows, por ser el creador de problemas, no nos dejó con demasiadas opciones si queríamos una base de código unificada, y ahí fue donde Go nos dio una esperanza. Gracias a la compilación cruzada de Go, actualmente tenemos un lanzamiento de nuestro SDK en la trifecta de los sistemas operativos. Después de eso, era solo cuestión de tiempo hasta que todos nos enamoramos por ello.

Go todavía es muy joven, y definitivamente se nota. Hay errores que yo mismo he encontrado en los paquetes estándar de la biblioteca, así como algunos problemas de documentación, pero el equipo ha sido más que rápido en solucionar todo. Ocasionalmente nos topamos con problemas en los que hemos tenido que conformarnos con soluciones menos que ideales. Go no puede demonizar correctamente, por lo que si está intentando demonizar con Go, es probable que desee un script de envoltura para hacerlo (al menos por ahora). Muchos de los paquetes estándar de la biblioteca, aunque no tienen errores, son muy inmaduros e inflexibles. Por lo tanto, nos hemos encargado de escribir nuestros propios paquetes de registro y análisis html, así como algunos otros.

Sin embargo, la comunidad alrededor de Go ha sido increíble; la documentación sigue mejorando, y las nuevas bibliotecas de código abierto están surgiendo constantemente. Con cada nueva versión de Go, las cosas se arreglan, se mejora la funcionalidad anterior y se agregan nuevas bibliotecas al paquete estándar. Siempre habrá cosas que no son las mejores, los problemas seguirán apareciendo y siempre se encontrarán errores, pero estoy de acuerdo con eso. Me he enamorado de Go, y lo tomaré, problemas y todo.

Si desea obtener más información sobre Moovweb, no dude en registrarse en nuestro portal para desarrolladores. ¡Puede descargar e instalar nuestro SDK en todas las plataformas principales!

Aprendí Go por un tiempo, haciendo algunos proyectos paralelos, pero ahora no uso Go activamente. Esta respuesta se basa en la experiencia personal.

Características del lenguaje

Go ofrece funciones de lenguaje seleccionadas pero limitadas. Parece un lenguaje C mejorado con un sistema de objetos simple. No creo que las características del lenguaje Go se destaquen mucho en comparación con otros lenguajes modernos de alto nivel. Aquí hay algunos problemas:

  • Sin genéricos: muchos Gophers prueban algunos trucos como la interfaz vacía o las utilidades de generación de código. Ninguno realmente nos satisface.
  • Sin herencia: debe reorganizar su base de código OO.
  • Sin sobrecarga funcional
  • Sin sobrecarga del operador
  • Estilo de código forzado: bueno para ingeniería, pero a veces demasiado restrictivo.

Ninguno es crítico, pero a algunos programadores simplemente no les gustan.

Biblioteca

Depende de sus aplicaciones de destino. Para aplicaciones de servidor, es maravilloso. (Las aplicaciones de Google se basan principalmente en la web). Para otros dominios, no es tan bueno. Por ejemplo, Go todavía carece de la biblioteca GUI de facto .

Cadena de herramientas

Go proporciona una buena cadena de herramientas incorporada. Hay algunas herramientas de desarrollo de terceros; Prefiero herramientas integradas cuando sea posible. No creo que sobreviva ningún lenguaje moderno de alto nivel sin una cadena de herramientas decente.

Solicitud

Go es bueno en algunos dominios pero no en otros. Aquí hay algunas listas:

  • Utilidad de consola: Go es un lenguaje fácil en comparación con C y C ++, por lo que es una buena alternativa para los programas de línea de comandos. Sin embargo, la mayoría de los usuarios finales no estarán interesados ​​en los programas CLI.
  • Aplicaciones GUI: Google parece no estar interesado en este dominio. Actualmente, tenemos que referirnos a los paquetes comunitarios.
  • Aplicaciones de servidor (por ejemplo, aplicaciones web): esta es la razón por la cual Google inventa Go. El soporte es asombroso.
  • Aplicaciones móviles: Go Mobile sigue siendo experimental. A medida que Kotlin se convierte en el primer ciudadano en el desarrollo de Android, el futuro de Go mobile no está claro. (¿Todavía necesitamos otro idioma para Android?)
  • Análisis de datos: no tan bueno. Existen algunos paquetes comunitarios.

Conclusión

Aunque Go es un lenguaje de propósito general, su mejor posición aún son las aplicaciones de servidor. De lo contrario, Go puede ser subóptimo.

  • Requiere más lectura que la mayoría de los idiomas para la primera configuración (exige que todos los programas Go residan en su propia jerarquía de directorios GOROOT)
  • El tiempo de compilación más lento entre todas las implementaciones de lenguaje compilado que uso, incluso supera a Javac (solía ser rápido cuando el compilador se escribió en C, dijeron)
  • Reglas de inicialización y alcance extrañas
  • Carece de herencia, introduce incrustación (¿qué?)
  • Implementación de interfaz: fácil de escribir, difícil de leer (no se puede saber directamente qué interfaces implementa una estructura)
  • Fácil de escapar de la seguridad del sistema tipo ( interface {} )
  • Intenté demasiado mezclar C, Pascal (Oberon) y Lua, y no funciona tan bien
  • El sector y el mapa integrados facilitan muchas tareas comunes
  • Modelo de concurrencia simple y bastante fácil de usar
  • Fácil de cambiar concurrente ↔ no concurrente
  • Ricas bibliotecas estándar, ricas bibliotecas de terceros

El bueno:

Go es una buena opción para las utilidades de la consola. Tiene un binario y no necesita preocuparse por si JRE está instalado en el sistema, y ​​cosas así.

También es bastante sólido si necesita algún demonio de red o proxy. El cliente y el servidor HTTP que se incorporaron al lenguaje son bastante buenos. JSON no es un ciudadano de primera clase, pero al menos el análisis JSON está ahí sin bibliotecas externas. Y es rápido, no puedo discutir con eso.

Además, me gustan las herramientas. Construido en formateador, prueba y marco de referencia “fuera de la caja”.

El malo:

Siete años desde su lanzamiento, y todavía no hay soporte de depuración IDE decente. Con Gogland casi no se puede evaluar nada durante la depuración, y la forma en que muestra los mapas es simplemente horrible.

Usar Go para aplicaciones web antiguas es simplemente horrible. Las validaciones de formularios sin capacidad para lanzar excepciones se convierten en una pesadilla. Demasiados tipos de números: int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64 … No me importa, solo necesito analizar algunos JSON ahora, ¡por favor! Y todo el análisis JSON es una estructura muy fuertemente tipada o una interfaz de mapa [cadena] {} muy tipeada. No hay nada en el medio.

¿Y si su JSON está bien estructurado, pero tiene campos opcionales? Entonces bienvenido a puntero desreferencia infierno.

Me gusta ir Me gusta su simplicidad y minimalismo. Es fácil de aprender y fácil de usar.

Me gusta su velocidad de compilación supersónica (gracias a la simplicidad del lenguaje).

Me gusta su administrador de paquetes.

Me gustan sus funciones de concurrencia integradas.

No tengo ningún problema con su estilo obstinado. No tengo ningún problema con su falta de genéricos (definibles por el usuario) (consulte ¿Quién necesita genéricos? ¡Use … en su lugar!).

¿Go tiene inconvenientes? Seguro. No me molesta

He estado en este negocio el tiempo suficiente para saber que todos los lenguajes de programación son perfectamente utilizables si tienes la actitud correcta. He aprendido a ser adaptable. Mientras el idioma no tenga fallas atroces, estoy de acuerdo con eso. En mi opinión, no hay nada atrozmente malo con Go. Estoy feliz de usarlo.

Puede ser un problema trivial para algunos, pero no estoy interesado en un lenguaje que fuerce una sintaxis en los desarrolladores. Siempre he sentido que el estilo de colocación de llaves de Allman, donde los alinea, es más limpio, más intuitivo y más fácil de leer al permitir una alineación clara del código.
Por ejemplo (estilo Allman):
si (x {
// …
}

En lugar de (estilo k & r):
si (x // …
}

Para mí, el verdadero problema aquí es que el compilador no debe imponer preferencias. En la actualidad, la situación es aún peor ya que el lenguaje, per se, no dicta un estilo, pero la inserción automática de punto y coma fuerza el estilo k & r al colocar un punto y coma incorrectamente si usa el estilo Allman. Entonces, ir está dictando algo que debería ser la preferencia personal del desarrollador. En mi opinión, esa es una mala práctica.
Ver: solo quiero ver el código de estilo de Allman y guardar el código de estilo de K&R
(o)
Ver: estilo de sangría
Para mi tiempo y esfuerzo, hay muchos otros idiomas (como Rust) que pueden hacer un trabajo tan bueno (o mejor) sin eliminar mi estilo preferido de codificación.
¡Los mejores deseos!

fácil de aprender y excelente implementación

lenguaje más fácil! ¡siempre! Los he usado alrededor de 2 años ahora para la producción (material de back-end). Solo necesito 1 día para entrenar a un nuevo programador usando este idioma: 3

Este diseño e implementación de lenguaje tiene el equilibrio correcto entre el consumo de memoria (frente a Java), el rendimiento en tiempo de ejecución (frente a cualquier perl / php / python / ruby), la concurrencia admitida a nivel de idioma (frente a casi todo lo demás) y la capacidad de mantenimiento del código (frente a otro idioma ), es realmente difícil escribir un código incorrecto (difícil de leer / comprender) porque la sintaxis en sí misma está estrictamente limitada por el simple hecho de aprender.

enfoque en productividad y mantenibilidad

solo lenguaje que no encontrará intimidante para una gran base de código.

es realmente fácil crear un servicio usando este lenguaje

a diferencia de otros idiomas, puede centrarse fácilmente en la creación de características en lugar de la sintaxis.

mucha gente los usa

Si todavía tiene dudas acerca de aprender Go, hay muchas compañías que migran allí y ya las están utilizando.

cosas malas

no encontrado, todavía estoy cegado por su belleza, mwhahaha! / ^ __ ^) /

ok, aquí tienes: ksimka / go-is-not-good y YourLanguageSucks – Theory.org Wiki

no está tan mal, pero la gente sigue insistiendo

  1. administración de paquetes, ve y obtén siempre suficiente para mí, bifurca primero, actualiza después cuando haya un error crítico sobre la biblioteca que usas
  2. genéricos, estoy de acuerdo con la implementación genérica (la mayoría de ellos son feos, difíciles de leer cuando hay errores), pero en el caso real, rara vez los uso, el tipo y la interfaz son suficientes para resolver la mayoría de las cosas. Pero sí, espero que haya genéricos menos potentes (limitados) para Go en aras de la simplicidad de la sintaxis
  3. binario grande, vaya hello world compila aproximadamente 1.5 MB (500 KB comprimido con upx) en comparación con 8 KB en C ++, realmente no importa porque siempre puede hacer un demonio en lugar de ejecutar con frecuencia el programa exec-print-exit
  4. la implementación actual tiene una velocidad de compilación más lenta en comparación con la velocidad increíblemente rápida 1.4

Tengo experiencia en Python y comencé a jugar con Golang en mi tiempo libre hace solo 2 semanas.

Tengo que decir que hasta ahora estoy realmente impresionado. Lo que me interesó fue ser usuario de Kubernetes, InfluxDB & Docker.

Go era el denominador común de todos estos grandes proyectos, así que solo tuve que comprobarlo.

Ya está claro para mí, que necesito cambiar mucho en mi pensamiento OOB, pero realmente veo las increíbles posibilidades que Go me ofrece, especialmente con proyectos de infraestructura y web.

Espero que dentro de 6 meses tenga cambios para darle un giro profesional.

PD. Prometo actualizar mi respuesta a medida que gane más experiencia.

Siempre he encontrado que los lenguajes de programación son intimidantes. Es el código que me permite escribir código. Seguramente personas más inteligentes que yo deberían estar trabajando en ello. Se siente demasiado distante para tocar y demasiado significativo para editarlo. Entonces, cuando surgió la oportunidad de unirme a un taller para contribuir a mi nuevo lenguaje de programación favorito, estaba tan emocionado de ver cómo podía ayudar. Un mes después, ahora estoy seguro de que cualquiera y todos pueden (y deberían) contribuir de nuevo a Go.

★★★

Go es un lenguaje sencillo con el que es muy fácil ser productivo. Es un lenguaje de tipo estático que se compila muy rápidamente en un ejecutable binario. Hay un fuerte énfasis en la programación del servidor dentro del lenguaje. Sin embargo, hay aspectos que considero fallas con el lenguaje.

  1. el lenguaje es muy aburrido … nada demasiado emocionante para jugar. Sin embargo, esto también puede verse como una ventaja, ya que puede conducir a la productividad.
  2. Ningún tipo genérico que pase por la interfaz {} anula el propósito de una compilación estáticamente tipada.
  3. Capitalización para miembros públicos y privados. Agradecería algo de explicidad.
  4. Me doy cuenta de que esto es un poco mezquino, pero no me gusta la actitud de Rob Pike y cómo inyecta su personalidad en la comunidad Go. Me doy cuenta de que esto no es estrictamente un “defecto” en el lenguaje.

Sin embargo, esta es toda mi opinión y hay importantes programas que se han desarrollado en Go (Docker).

Puedes leer mi reseña de Go en mi blog aquí: si C y Python tuvieran un bebé, se llamaría Go

Es una publicación de blog bastante corta.