He estado programando usando PHP profesionalmente desde hace 10 años. Después de mi título en Ingeniería Informática, todo lo que sabía era que Java ya no era mi pan comido (después de más de 6 años usándolo para proyectos personales y académicos), quería unmuchouna pila más simple y descubrí que una forma rápida de promocionarme como desarrollador independiente era ingresar al creciente mercado de CMS PHP.
A lo largo de los años, PHP ha cambiadoun montony si bien a muchas personas les gusta criticarlo, muchos lo hacen basándose en muy poca experiencia y en muy poco tiempo. PHP moderno, especialmente si tiene el lujo de usar tipos de PHP 7 y dejar atrás PHP 5.x, es muy agradable para trabajar y, por supuesto, PHP tiene la ventaja de ser, por alguna razón, el lenguaje que puede implementar casi en todas partes, razón por la cual muchos CMS están integrados en PHP y por qué tienen tanto éxitoporqueestán basados en PHPGravincluido).
Por supuesto, PHP es solo una herramienta, y recientemente he estado profundizando en Go de cabeza.
Comparado con PHP, Go es un lenguaje y un entorno completamente diferente.
Esto no es una perorata o un artículo destinado a alejarte de PHP, sino más bien presentarte, desarrollador de PHP, por qué Go es un buen lenguaje para aprender como herramienta complementaria.
Lo primero es lo primero: ¿qué es Go?
Go es un lenguaje de programación imperativo y orientado a objetos diseñado en Google hace 10 años.
El conocimiento combinado de los miembros fundadores y la filosofía original de crear el mejor lenguaje para las necesidades que tenían, llevaron a Go.
Go es un lenguaje compilado, tipado estáticamente, con funciones integradas de recolección de basura y programación simultánea.
No es nada nuevo
La forma en que Go va innovando es bastante interesante. Ignora por completo la exageración sobre las supuestas características nuevas que debería tener un lenguaje moderno y lo que proporcionan otros lenguajes de programación, pero en su lugar selecciona el concepto central de los lenguajes probados en batalla, agregando décadas de experiencia en programación en una hermosa herramienta para usar.
The task of the programming language designer is consolidation not innovation – Hoare, 1973
Go tiene muchas características únicas, por supuesto, no es solo un lenguaje mashup. Ir presentadogorutinas, que son una forma asombrosa de manejar la simultaneidad. Ir presentadoaplazar, una excelente manera de ejecutar algo cuando regresa la función externa (ahora también agregada a Swift).
Go fue el primer idioma en introducir un formateador en las herramientas estándar. Y la capacidad de compilar para otras plataformas sin fricciones, además de muchas más cosas "nuevas".
Go tiene raíces fuertes. Una hermosa presentación en la GopherCon 2015 de Robert Griesemer lo ilustra: Go fusiona muchos principios de ambosCy Oberon-2, que es un idioma que proviene de la familia Pascal. Ambos lenguajes se originan en Algol 60, que se introdujo en 1960.
Asi que la proxima vezalguien pregunta por qué Go parece un idioma de hace 20 años, también puede responder que en realidad tiene más de 60 años de experiencia en su haber. Como dijo una vez Robert Griesemer, se necesitan 10 años para que un lenguaje de programación se convierta en algo común.
Go apenas está comenzando, lo cual es muy emocionante pensando en su futuro y en lo que la gente puede construir con él.
Go es complementario a PHP
Si alguna vez usó Ruby o Python además de PHP, es posible que se haya dado cuenta de que se reducen más o menos a una versión diferente de PHP, si elimina el fanboyismo y las preferencias personales de la ecuación, ya que todos son lenguajes interpretados de forma flexible.
Uno podría cambiar a Ruby a PHP y Python y hacer las mismas cosas. El único "lenguaje web" que difiere sustancialmente esJavaScript, que es diferente debido al modelo sin bloqueo (pero que se ha migrado a otros lenguajes, incluido PHP también a través de bibliotecas) y porque es el único lenguaje que actualmente se ejecuta de forma nativa en el navegador, lo que le da una enorme ventaja. Además, es un ecosistema mucho más salvaje de entornos de ejecución incontrolados, todos diferentes en formas posiblemente sutiles.
Ir por otro lado es una bestia completamente diferente. Es un lenguaje de sistema, como C. Y a diferencia de los lenguajes dinámicos, Go es rápido.
PHP está construido en C, y puedes escribir y ejecutar PHPCextensiones, por lo que el concepto de un lenguaje de sistema no debe sereseajeno a ti.
Go es capaz de reemplazar su pila web, y hay marcos web disponibles para eso, lo que lo hace fácil, pero PHP todavía tiene su lugar, especialmente cuando se crean prototipos y aún no sabe qué parte de su código necesitará una gran optimización, y si su código se usará realmente después de todo.
Entonces, ¿cuándo debería usar Go? Cuando usa PHP pero PHP no es realmente la mejor herramienta para el trabajo. Si PHP consume demasiada memoria o recursos para una función en particular, un programa Go altamente optimizado funcionará mucho mejor. Simple como eso. PHP 7 ha sido increíble a la hora de mejorar el rendimiento de PHP. Ese fue un regalo gratis. Pero cuando necesita procesar millones de entradas de bases de datos o obtener Gigabytes de datos de una API con un proceso de larga ejecución, PHP puede no ser la herramienta adecuada.
He confiado enNode.jsdurante bastantes años para resolver este problema, pero a medida que fui conociendo a Go, hasta ahora cualquier cosa que se me ocurra con Go es una solución mucho más simple y mejor.
Y no se queda ahí, por supuesto. Con Go, puede crear aplicaciones simultáneas y multiplataforma en un abrir y cerrar de ojos, y esto es muy diferente del desarrollo web PHP, es mucho más desafiante, pero también, personalmente hablando, más interesante y podría ofrecerle muchos trabajos gratificantes.
Por lo tanto, como desarrollador de PHP, podría comenzar a entregar tareas exigentes a Go, mientras que, sin duda, enriquecerá sus opciones profesionales.
¿Por qué ir y no C C ++ o Java?
Cualquier idioma tiene su lugar. Seguramente Go no puede superar las prestaciones de C y C ++. Hay muchos puntos de referencia que puede encontrar.
Go se encuentra en el medio entre esos 2 lenguajes tradicionales e históricos y los lenguajes dinámicos: desea más rendimiento del que puede obtener de un lenguaje interpretado, pero no está listo o no está dispuesto a usar C o C ++, que son más rápidos pero son de nivel demasiado bajo y necesitaría administrar manualmente la memoria, y llevaría mucho más tiempo desarrollarlos. Vaya encaja en ese lugar.
Para un fragmento de código altamente optimizado, C o C ++ podrían ser una mejor solución, si es muy competente con ellos. Podría decir lo mismo de Assembly.
En comparación con Java, es una situación completamente diferente. Java requiere mucha sobrecarga en términos de entorno, mientras que los programas Go son un solo archivo, livianos, portátiles y nativos.
Y probablemente estamos comparando manzanas con naranjas, nunca usarías Go donde usas Java, y lo contrario es cierto.
Ir es simple de corazón
(Y recuerde: simple no significa fácil) Evitar el deslizamiento de funciones era claramente uno de los objetivos de los diseñadores de Go. El legendario Ken Thompson, uno de los 3 diseñadores originales de Go, también creador de UNIX y el lenguaje B (entre muchas otras cosas), dijo una vez
Cuando los tres [Thompson, Rob Pike y Robert Griesemer] comenzamos, fue pura investigación. Los tres nos juntamos y decidimos que odiamos C ++. [risas]… [Volviendo a Go,] comenzamos con la idea de que los tres teníamos que ser hablados en todas las características del idioma, por lo que no había basura extraña en el idioma por ningún motivo.
Esto resultó en un lenguaje que es sorprendentemente simple para cualquier desarrollador experimentado que haya estado codificando en cualquier idioma.
Java, C ++, C, C #, Erlang, JavaScript, Swift, casi todos los lenguajes de programación modernos son mucho más complejos que Go.
Y aquí me refiero a complejo de usar para el programador, complejo de leer, complejo para convertirse en un maestro. En el interior, Go esconde toda la complejidad y expone una API simple. Go no solo tiene recolección de basura, sino que no hay ninguna funcionalidad de administración de memoria expuesta.
Solo piense que PHP tiene 67 palabras clave, mientras que Go tiene 25.
El punto clave aquí es que nuestros programadores son Googlers, no son investigadores. Por lo general, son bastante jóvenes, recién salidos de la escuela, probablemente aprendieron Java, tal vez aprendieron C o C ++, probablemente aprendieron Python. No son capaces de comprender un lenguaje brillante, pero queremos usarlos para crear un buen software. Por lo tanto, el lenguaje que les damos tiene que ser fácil de entender y de adoptar. - Rob Pike
Esto es fundamental para la filosofía de Go y explica por qué Go elige evitar la implementación de funciones (evitando el deslizamiento de funciones) y por qué muchos conceptos de programación funcional se dejan de lado, ya que son complejos para razonar y abrir debates. La programación funcional pura está demasiado lejos de los conceptos de la máquina para ser relevante para Go, que es un lenguaje imperativo en el fondo.
Dicho esto, Go tiene implementados muchos conceptos de programación funcional, como funciones de primera clase (que permiten asignar funciones a variables), cierres, recursividad.
Pero en comparación con PHP o JS, no tiene operaciones funcionales como mapear, reducir o filtrar, debe confiar en los bucles. ¿Por qué? Porque esas operaciones son ineficientes y Go debe encontrar un equilibrio.
Hablando de cosas que faltan, no hay excepciones para manejar errores. No hay clases (aunque está orientado a objetos, con estructuras con métodos asociados, forzandocomposición sobre herencia- si tiene conocimiento de la implementación de objetos prototipo de JavaScript, esto le resultará familiar, pero muy diferente), no genéricos (aunque PHP tampoco los tiene), yaquí es por qué.
Menos es más, ¡o mejor!)menos es exponencialmente más.
Solo hay una forma de escribir un bucle:for
. Olvidarwhile
ydo — while
yforeach
(¿algo más?).
La capacidad de devolver múltiples valores de una función evita muchos trucos (el ejemplo más simple es devolver una matriz que contiene 2 valores y tener que extraerlos sin saber el tipo exacto pasado).
La simplicidad es heredada por las herramientas.gofix corrige automáticamente los cambios importantes en la API en las nuevas versiones de Go.
And Go es simple por diseño y siempre será simple.
Como dice Rob Pike, muchos otros lenguajes están copiando características entre sí, perdiendo sus aspectos únicos (piense en JavaScript introduciendo la sintaxis de las clases para complacer a los desarrolladores de Java y PHP) y todos convergen idealmente en un lenguaje conceptualmente único.
Go no compite en funciones. Esto me recuerda aeste artículo Getting Real.
Cuidado: Go está polarizando
Go tiene muchos fanáticos y también muchos enemigos. Como desarrollador de PHP, estoy seguro de que desarrolló una piel dura en este tipo de guerras de llamas, y podemos pasar rápidamente al siguiente punto. Es muy popular y los desarrolladores tienen opiniones sólidas.
Go resuelve un problema maravillosamente. Y no necesita ser un genio para comenzar a usarlo, aunque esto podría herir sus sentimientos.
Go es muy testarudo y tiene convenciones claras
Una de las primeras cosas que notará sobre Go es que casi todo el código que puede encontrar se ve casi igual.
Esto se debe a que Go tiene convenciones claras y forzadas. Las herramientas integradas proporcionan 2 comandos relacionados con las convenciones (gofmtyGolint, con el primer código de formato automático y el segundo solo imprimiendo advertencias), y pueden verificar si su código cumple, e incluso ajustar automáticamente su estilo a las pautas de Go.
Esto es diferente a JSESLint/ JSHint, ya que esas herramientas son aplicaciones para todo el equipo. Como en todo JS, puede personalizar cualquier cosa en las preferencias.gofmt
es uno, sin configuración, ese es el camino a seguir.
Esto es excelente para proporcionar coherencia en su propio código (el código que escribió hace 5 años en PHP o JavaScript puede sermuydiferente de sus convenciones y preferencias actuales) y en el código quetodosdistribuye.
Imagine que no habrá más discusiones de equipo internas sobre el mejor estilo de código, imagine todos los RP de su proyecto de código abierto formateados y enlazados de la misma manera. Espacios frente a 0 pestañas, ahorre ciclos mentales: son pestañas. ¿Frenillos en la misma línea o en la siguiente? Siempre en la misma línea (hay una razón para esto y es permitir omitir el punto y coma).
Go genera un error de compilación si no se utiliza una variable o importación, lo que evita que sus programas acumulen basura con el tiempo.
Las convenciones de nomenclatura son tan importantes que los modificadores de acceso se han eliminado por completo de la ecuación. Variable en minúscula? Privado. Variable capitalizada? Público. Tan simple como eso, una simple convención elimina toneladas de uso inútil del espacio de la pantalla, además es inmediatamente comprensible.
Los comentarios satisfacen una necesidad especial, y los escribe en una sintaxis especial para que su paquete pueda ser inspeccionado usandogo doc
y tienes toda la documentación que necesitas sin buscarla en Google.
go get
está a su disposición, integrado (que es ideal para código abierto y distribución). Aunque PHPland es mucho más avanzado en mi opinión en términos de gestión de dependencias.
PHPUnit / Codeception? No hay necesidad,go test
ya está ahí para tu*_test.go
archivos.
Te convierte en un mejor programador
Si viene de PHP, aprender Go le hará pensar de una manera nueva y diferente. Te convertirá en un mejor programador, al igual que aprender cualquier idioma diferente: te presenta nuevos conceptos. Si se siente extraño y ajeno, es una buena señal de que está aprendiendo y creciendo como desarrollador.
Para empezar, Go se compila en lugar de interpretarse. Flujo de trabajo e implementación completamente diferente.
Si no tiene experiencia con la escritura fuerte, eso es un cambio de paradigma. PHP 7 viene con verificación de escritura y es de gran ayuda si no tiene que admitir versiones anteriores de PHP. Go está fuertemente tipado. Muchos, si no todos, los problemas de tipo se resuelven en tiempo de compilación.
Go es increíblemente simple, diseñado para ser simple, y ser un desarrollador de Go significa reconocer esta simplicidad y aprovecharla, y no intentar escribir Go como Java, sino abrazarlo.
Y por simple no quiero decir que Go sea un lenguaje de juguete, ciertamente no lo es, y no es un lenguaje que yo le presentaría a alguien a la codificación.
Por simplicidad me refiero a másminimalismoysin pelusa.
Cuando un idioma te ofrece muchas formas de hacer lo mismo, te ves obligado a pensar cuál es la mejor, distrayéndote del problema que estás tratando de resolver.
Puede ejecutar código Go desde PHP
Entonces, una forma en la que sugiero comenzar es codificar alguna rutina pesada o un fragmento de código de larga ejecución que consuma demasiada memoria como un servicio de Go.
Allíson muchos maneraspara llamar directamente a los programas Go desde PHP, pero también puede optar por implementar uncola de servicio a través de ZeroMQo acceda a un programa go de larga duración mediante la exposición de un punto final de API a través de un proxy inverso. Tienes muchas opciones.
El arma especial de Go: concurrencia
Se sabe que PHP-FPM maneja muy bien las solicitudes concurrentes, generando un nuevo proceso que ejecuta el código PHP real para cada usuario. Y, por lo general, en una aplicación web, la base de datos es el cuello de botella. Pero, ¿qué pasa con los procesos de larga ejecución (algo que realmente no desea construir en PHP), o cuando necesita iniciar un ciclo computacional pesado dentro de una solicitud de PHP, donde necesita ejecutar decenas de miles de procesos concurrentes?
PHP tiene soporte para subprocesos, por lo que puede realizar un procesamiento concurrente, pero mientras que PHP (o incluso C y otros) puede realizar concurrencia utilizando la ayuda de bibliotecas externas al lenguaje, Go esdiseñadocon programación concurrente incorporada, y proporciona formas nativas de comunicarse entre goroutines.
Los hilos son pesados, en comparación congorutinas. Un sistema podría soportar 10k subprocesos, y el mismo sistema podría soportar millones de goroutines, debido a que la implementación interna del consumo de memoria de goroutines es mucho más liviana, como en Java o Erlang.
Entonces, incluso si no necesita millones de solicitudes simultáneas, las ganancias de rendimiento son claras.
Además, es muy fácil digerir goroutines y comprender lo que hace el código de un vistazo rápido.
No es necesario extender las clases o incluir extensiones especiales, que pueden no estar siempre disponibles (esto limita efectivamente el grado en que podemos usar la concurrencia PHP para el código distribuido autoinstalado)
Sólo tipogo someFunction()
y esa función se ejecutará en una goroutine.
Conclusión
Si es un desarrollador de PHP nuevo en Go, espero que ahora tenga curiosidad por esta herramienta y piense en dónde podría haber sido útil o si es la opción correcta para usted.
Si eres un programador que prefiere la simplicidad a la complejidad, prefieres el código directo y legible sobre las abstracciones, estoy seguro de que Go encontrarás realmente interesante.
Más tutoriales de go:
- Uso de NGINX Reverse Proxy para brindar servicios de Go
- Hacer una copia de una estructura en Go
- Los conceptos básicos de un servidor web Go
- Ordenar un tipo de mapa en Go
- Ir consejos en pocas palabras
- Explicación de las etiquetas Go
- Ir al formato de fecha y hora
- Procesamiento JSON con Go
- Ir a funciones variadas
- Hoja de referencia de Go Strings
- Explicación de la interfaz Go Empty
- Depuración de Go con VS Code y Delve
- Parámetros de devoluciones de Go Named
- Generación de cadenas y números aleatorios en Go
- Estructura del sistema de archivos de un proyecto de Go
- Algoritmo de búsqueda binaria implementado en Go
- Uso de indicadores de línea de comando en Go
- GOPATH explicado
- Cree una aplicación de línea de comandos con Go: lolcat
- Construyendo un comando CLI con Go: cowsay
- Uso de Shell Pipes con Go
- Tutorial de Go CLI: clon de la fortuna
- Enumere los archivos en una carpeta con Go
- Use Ir para obtener una lista de repositorios de GitHub
- Ve, agrega un trozo de cadenas a un archivo
- Ve, convierte una cadena en un segmento de bytes
- Visualice sus contribuciones locales de Git con Go
- Introducción a la creación de perfiles de memoria y CPU de Go
- Resolver el error "no admite la indexación" en un programa Go
- Medir el tiempo de ejecución en un programa Go
- Creación de un rastreador web con Go para detectar títulos duplicados
- Siga las mejores prácticas: ¿puntero o receptores de valor?
- Siga las mejores prácticas: ¿Debería utilizar un método o una función?
- Ir a estructuras de datos: Establecer
- Hoja de referencia de Go Maps
- Genere implementaciones para tipos genéricos en Go
- Ir a estructuras de datos: diccionario
- Ir a estructuras de datos: tabla hash
- Implementar oyentes de eventos en canales de paso
- Ir a estructuras de datos: apilar
- Ir a estructuras de datos: cola
- Ir a estructuras de datos: árbol de búsqueda binaria
- Ir a estructuras de datos: gráfico
- Ir a estructuras de datos: lista vinculada
- La guía completa de Go Data Structures
- Comparación de valores de Go
- ¿Go está orientado a objetos?
- Trabajar con una base de datos SQL en Go
- Usar variables de entorno en Go
- Ir al tutorial: API REST respaldada por PostgreSQL
- Habilitación de CORS en un servidor web Go
- Implementación de una aplicación Go en un contenedor Docker
- Por qué Go es un lenguaje poderoso para aprender como desarrollador PHP
- Ve, elimina el carácter de nueva línea io.Reader.ReadString
- Ir, cómo ver los cambios y reconstruir su programa
- Ve, cuenta los meses desde una fecha
- Acceder a los parámetros HTTP POST en Go