Ve a través de los ojos de un programador de Rust: primeras impresiones

En previsión del comienzo del curso, "Golang Developer" preparó una traducción de material interesante. ¿Cuál fue tu primera impresión de Go?




En las últimas semanas, he podido usar Go en mi trabajo. Primero utilicé Go en un proyecto más o menos grande y serio. Antes de eso, leí mucho sobre Go y practiqué ejemplos y pequeños programas mientras estudiaba las capacidades de Rust , pero la programación real es un asunto completamente diferente.

Pensé que te podría interesar escuchar mis impresiones. Intentaré no quedar atrapado en las comparaciones con Rust, pero como este es mi idioma principal, no se pueden evitar. Debo advertirte de antemano sobre un fuerte sesgo hacia Rust, pero haré todo lo posible para ser objetivo.

Impresiones generales


Ir a programar es bueno. Las bibliotecas tenían todo lo que necesitaba sin demasiados defectos. El aprendizaje también fue una experiencia agradable: es un lenguaje bien pensado y práctico. Como ejemplo, si aprende la sintaxis, verá que muchos modismos de otros idiomas se migran a Go. Una vez que domine la parte Go, puede predecir fácilmente sus capacidades. Con algo de experiencia en otros idiomas, podría leer y comprender el código Go sin ninguna ayuda especial de Google.

Noté mucha menos frustración y mucha más productividad que usar C / C ++, Java, Python, etc. Sin embargo, Go todavía se siente como parte de esta generación de lenguajes. Él ha aprendido de ellos, y creo que este es probablemente el mejor lenguaje de esta generación; pero definitivamente es parte de esta generación. Representa una mejora incremental en lugar de algo fundamentalmente nuevo (debe tenerse en cuenta que esto no es un juicio de valor: el incremento a menudo es beneficioso en el mundo del desarrollo de software). Un buen ejemplo de esto es nulo: lenguajes como Rust y Swift eliminan el paradigma nulo, eliminando así toda una clase de errores. Ir lo hace menos peligroso: no hay valores nulos; delimitación de cero y 0. Pero la idea básica aún está presente, así como el error generalizado de tiempo de ejecución de desreferenciar un puntero nulo.

Facilidad de desarrollo


Ir es increíblemente fácil de aprender. Sé que este es un eslogan publicitario propagado, pero me sorprendió mucho lo rápido que pude alcanzar el nivel de productividad. Gracias a la documentación, las herramientas y el lenguaje en sí, en solo dos días comencé a escribir código informativo y fácil de confirmar.

Varios factores a favor del aprendizaje:

  • Ve pequeño. Muchos idiomas intentan ser pequeños, mientras que Go es en realidad uno. (Esto es principalmente bueno, y estoy impresionado con la disciplina que se requería para esto).
  • La biblioteca estándar es buena (y de nuevo también pequeña). Encontrar y usar bibliotecas en un ecosistema es muy fácil.
  • El idioma tiene muy poco que no esté en otros idiomas. Go hereda muchos bits de otros idiomas establecidos, los pule y los conecta perfectamente. Evita cuidadosamente la novedad.


Rutina de código


El código Go se vuelve repetitivo muy rápidamente. Carece de cualquier mecanismo como macros o genéricos para reducir la repetición (las interfaces son buenas para las abstracciones, pero no tan buenas para reducir la duplicación de código). A menudo acumulo una gran cantidad de funciones que son idénticas, excepto los tipos.

El manejo de errores también contribuye a la repetición. Muchas características tienen más plantillas if err != nil { return err }que el código original.

El uso de genéricos o macros para reducir la rutina del código a veces se critica por el compromiso con su legibilidad. Pero en el caso de Go, no estaría de acuerdo con ellos. Copiar y pegar código es rápido y fácil, pero leer el código Go puede ser frustrante porque debe ignorar la mayor parte o buscar diferencias sutiles.

Lo que me gustó


  • . ; Rust. , ( , C/C ++ , - ).
  • . Go — . , , , .
  • . , , .
  • if ...; ... { }sintaxis. La capacidad de limitar el alcance de las variables al cuerpo de las declaraciones if es buena. Esto es similar a si se deja entrar a Swift y Rust, pero tiene un propósito más general (Go no tiene un patrón coincidente como Swift y Rust, por lo que no se puede usar si se deja).
  • Los comentarios de prueba y de muelle son fáciles de usar.
  • La herramienta Go es agradable: todo a la vez en un solo lugar sin tener que conectar muchas herramientas a través de la línea de comando
  • ¡En existencia recolector de basura (GC)! No es necesario preocuparse por la gestión de la memoria, lo que facilita la programación
  • Varargs


Lo que no me gustó


El orden no importa.

  • nil slices - nil, nil slices y empty slices son cosas diferentes. Estoy más que seguro de que solo necesitas dos, no los tres.
  • No hay clases primarias. El uso de constantes es inusual.
  • . , ( , , , , ).
  • switch
  • for ... range /. ( ), . -, , .
  • :
    • .
    • ( , , ); , , .
    • , return.
    • (type struct).
    • public private. , .
  • . , , , , , , , .
  • No puede escribir funciones con un receptor en otro paquete, por lo tanto, incluso si las interfaces se escriben implícitamente, no se pueden implementar para tipos superiores, lo que las hace mucho menos útiles.

Ya mencioné la falta de genéricos y macros arriba.

Coherencia


Como desarrollador y programador de lenguaje, probablemente me sorprendió mucho el hecho de que Go a menudo encuentra una discrepancia entre lo que está incorporado y lo que está disponible para los usuarios. La tarea de muchos idiomas es disipar tanta magia como sea posible y hacer que las funciones integradas estén disponibles para los usuarios. La sobrecarga del operador es un ejemplo simple pero controvertido. ¡Go tiene mucha magia! Y muy fácilmente te topas con un muro de incapacidad para hacer lo que las cosas integradas pueden hacer.

Algunos puntos que destacan especialmente:

  • , , .
  • for ... range , , .
  • , len append, , . . , Go !
  • . ==, , map, . .



Go es un lenguaje simple, compacto y agradable. Tiene algunas esquinas afiladas, pero sobre todo está bien diseñado. Es increíblemente rápido para aprender y evita cualquier característica que no se conozca en otros idiomas.

Comparado con Rust, Go es un lenguaje completamente diferente. Aunque ambos pueden describirse aproximadamente como lenguajes de sistema o "reemplazos" para C, tienen diferentes objetivos y aplicaciones, estilos de diseño de lenguaje y prioridades. La recolección de basura es realmente una gran diferencia. Tener GC en Go hace que el lenguaje sea mucho más simple y pequeño, y más fácil de entender. La falta de GC en Rust lo hace muy rápido (especialmente si necesita un retraso claro, y no solo un gran ancho de banda) y proporciona características y patrones de programación que son imposibles en Go (al menos sin sacrificar el rendimiento).

Go es un lenguaje compilado con un tiempo de ejecución bien implementado. Él es rápido. Rust también se compila, pero tiene un tiempo de ejecución mucho menor. Él es muy rápido. Suponiendo que no haya otras restricciones, creo que elegir entre usar Go y Rust es un compromiso entre una curva de aprendizaje mucho más corta y programas más simples (lo que significa un desarrollo más rápido) y, por parte de Rust, un sistema más rápido y expresivo tipos (lo que hace que sus programas sean más seguros y agiliza la depuración y la resolución de problemas).



La traducción ha llegado a su fin, y lo invitamos a una lección práctica gratuita en línea donde aprenderá a crear un servicio http completamente probado desde cero en 60 minutos sin dependencias de terceros.



All Articles