24 puntos por GN⁺ 2024-09-30 | 2 comentarios | Compartir por WhatsApp

Desde Go 1.22, la biblioteca estándar ofrece mejor soporte para routing

  • Antes había que manejar el routing manualmente, pero ahora se puede hacer de forma simple con mux.HandleFunc
  • También se puede agregar middleware de inicio de sesión para reforzar la seguridad

Precaución con el router integrado: redirecciones por la barra final

  • Si creas la ruta /records/, una solicitud a /records será redirigida a /records/
  • Esto puede provocar que el cuerpo de una solicitud POST se elimine y se convierta en una solicitud GET
  • La solución es usar endpoints de API como POST /records en lugar de POST /records/

Generación automática de código de consultas a base de datos con sqlc

  • Encontró la herramienta sqlc, que permite escribir consultas SQL sin tener que aprender un ORM
  • Al escribir consultas SQL, se convierten automáticamente a código Go
  • Hace posible escribir fácilmente las consultas SQL necesarias sin tener que revisar la documentación de un ORM

Consejos de optimización para sqlite

  • Usar un objeto de base de datos solo para escritura y configurar db.SetMaxOpenConns(1)
  • Para mejorar la velocidad de lectura, usar objetos de BD separados para escritura y lectura
  • Dos tablas que no necesiten JOIN pueden ponerse en bases de datos separadas y conectarse de forma independiente

Configuración del límite de memoria del GC en Go 1.19

  • Al ejecutar todos los proyectos de Go en una VM con relativamente poca memoria, como 256 MB o 512 MB, surgía el problema de que la aplicación terminaba continuamente por OOM
  • Debido a la configuración predeterminada del recolector de basura, se permite asignar memoria hasta 2 veces el tamaño actual del heap
  • En Go 1.19 se añadió una forma de indicar que el GC se ejecute cuando la aplicación alcance cierto uso de memoria
  • Después de establecer el límite de memoria del GC en 250 MB, disminuyó la frecuencia de cierres por OOM export GOMEMLIMIT=250MiB

Por qué crear sitios web con Go

  • Se despliega fácilmente como un único binario estático
  • Incluye un servidor web integrado apto para producción, por lo que no hace falta configurar WSGI u otros componentes
  • La toolchain de Go es fácil de instalar y usar
  • Enviar respuestas HTTP es simple, lo que facilita el mantenimiento del proyecto
  • La biblioteca estándar incluye net/http, así que se pueden crear sitios web sin instalar librerías adicionales
  • También permite realizar con facilidad tareas a nivel de sistema
  • Da la impresión de que todo está hecho para que el proyecto sea fácil de manejar

Problemas que aún no ha resuelto

  • Cosas que todavía no ha hecho mucho en Go
    • Renderizado de plantillas HTML
    • Implementar un sistema real de inicio de sesión
    • Implementar CSRF
  • En general, como no sabe bien cómo implementar funciones sensibles de seguridad, evita empezar proyectos que requieran login/CSRF y similares

Es genial ver las nuevas funciones de Go

  • Las dos funciones de Go mencionadas en este texto (GOMEMLIMIT y el routing) fueron agregadas en los últimos años
  • Parece que debería prestar más atención a las notas de lanzamiento de las nuevas versiones de Go

2 comentarios

 
secret3056 2024-09-30

sqlc es realmente excelente.

 
GN⁺ 2024-09-30
Opinión de Hacker News
  • El lenguaje Go permite retomar la programación sin problemas incluso después de trabajar en un proyecto durante 5 días y dejarlo abandonado por 2 años
  • Empezaron a aprender Go hace varios años, pero como casi no ha cambiado, sigue siendo útil incluso después de mucho tiempo
  • Es una pena que en el post sobre desarrollo web con Go no se haya mencionado el paquete embed
    • Es muy conveniente para empaquetar recursos estáticos en un solo binario
  • Las transacciones de base de datos están diseñadas para fallar, así que siempre se debería usar un bucle de reintentos
    • Conviene agregar Context al bucle de transacciones para permitir su cancelación
  • sqlc tiene algunas limitaciones importantes y pequeñas incomodidades, así que conviene revisar la lista de issues antes de usarlo
    • No soporta consultas dinámicas, relaciones uno a muchos, CTE embebidos, tipos compuestos, etc.
    • Sirve para requisitos simples, pero para trabajo complejo hay que usar un enfoque manual
  • Al ejecutar Go dentro de contenedores, hay que configurar correctamente GOMAXPROCS para evitar el throttling de CPU
  • Usar GOMEMLIMIT puede reducir la preocupación por el GC
    • Se puede configurar automáticamente al usar Kubernetes o Docker
  • html/template es extraño y tiene muchos problemas, así que es mejor no usarlo
    • En su lugar prefieren Templ
  • Da gusto ver una mención sobre routing
    • Durante mucho tiempo estuvieron acostumbrados a mux, pero no habían prestado atención a las funciones de los lanzamientos recientes
  • Lleva un mes usando Go en un trabajo nuevo, pero no le gusta
    • Go parece no haber aprendido nada de los últimos 20 años de desarrollo de lenguajes
    • El problema de nil hace que hasta las tareas simples se vuelvan complejas
  • Al usar SQLite, conviene tener un pool de escritura de un solo hilo y otro pool separado para lectura
    • Se puede mejorar la concurrencia con BEGIN CONCURRENT
  • Les encanta la simplicidad de Go y el hecho de que no dependa de frameworks
    • Solo con la biblioteca estándar y librerías de terceros ya probadas se pueden hacer cosas excelentes
    • Go es ideal para crear web apps o herramientas CLI
    • Les gusta el manejo explícito de errores
    • Son muy fans de Go