24 pontos por GN⁺ 2024-09-30 | 2 comentários | Compartilhar no WhatsApp

A partir do Go 1.22, a biblioteca padrão oferece melhor suporte a roteamento

  • Antes era preciso lidar com o roteamento manualmente, mas agora é possível fazer isso de forma simples com mux.HandleFunc
  • Também é possível adicionar middleware de login para reforçar a segurança

Atenção com o roteador embutido: redirecionamento por causa da barra final

  • Se você criar a rota /records/, uma requisição para /records será redirecionada para /records/
  • Isso pode fazer com que o corpo de uma requisição POST seja removido e ela seja alterada para uma requisição GET
  • A solução é usar endpoints de API como POST /records em vez de POST /records/

Geração automática de código de consulta ao banco de dados com sqlc

  • Foi descoberto o sqlc, uma ferramenta que permite escrever consultas SQL sem precisar aprender um ORM
  • Você escreve as consultas SQL e elas são convertidas automaticamente em código Go
  • Assim, fica fácil escrever as consultas necessárias sem depender da documentação de um ORM

Dicas de otimização para sqlite

  • Use um objeto de banco de dados dedicado apenas à escrita e configure db.SetMaxOpenConns(1)
  • Para aumentar a velocidade de leitura, use objetos de DB separados para escrita e leitura
  • Duas tabelas que não precisam de JOIN podem ser colocadas em bancos separados e conectadas de forma independente

Configuração do limite de memória do GC no Go 1.19

  • Ao executar projetos Go em VMs com relativamente pouca memória, como 256MB ou 512MB, surgiu um problema em que a aplicação continuava sendo encerrada por OOM
  • Por causa da configuração padrão do coletor de lixo, é permitido alocar memória até o dobro do tamanho atual do heap
  • No Go 1.19, foi adicionada uma forma de instruir a aplicação a executar o GC quando atingir um determinado uso de memória
  • Depois de definir o limite de memória do GC em 250MB, a frequência de encerramentos por OOM diminuiu export GOMEMLIMIT=250MiB

Por que criar sites com Go

  • A implantação é simples com um único binário estático
  • Há um servidor web embutido pronto para produção, então não é necessário configurar WSGI e similares
  • O toolchain do Go é fácil de instalar e usar
  • Enviar respostas HTTP é simples, o que facilita a manutenção do projeto
  • A biblioteca padrão inclui net/http, então é possível criar sites sem instalar bibliotecas adicionais
  • Também é fácil realizar tarefas em nível de sistema
  • Tudo parece ter sido feito para tornar o projeto fácil de lidar

Problemas que ainda não foram resolvidos

  • Ainda há várias coisas que não foram muito exploradas em Go
    • Renderização de templates HTML
    • Implementação de um sistema de login real
    • Implementação de CSRF
  • Em geral, como ainda não se sabe bem como implementar recursos sensíveis à segurança, evita-se começar projetos que precisem de login/CSRF e semelhantes

É legal ver os novos recursos do Go

  • Os dois recursos do Go mencionados neste texto (GOMEMLIMIT e roteamento) foram adicionados nos últimos anos
  • Parece que vale a pena prestar mais atenção às notas de lançamento das novas versões do Go

2 comentários

 
secret3056 2024-09-30

o sqlc é realmente ótimo

 
GN⁺ 2024-09-30
Opiniões no Hacker News
  • A linguagem Go permite voltar a programar sem problemas em um projeto mesmo depois de trabalhar nele por 5 dias e deixá-lo parado por 2 anos
  • Começou a aprender Go há alguns anos, mas como a linguagem quase não mudou, ela continua útil mesmo depois de muito tempo
  • É uma pena que o pacote embed não tenha sido mencionado no post sobre desenvolvimento web em Go
    • Empacotar recursos estáticos em um único binário é muito conveniente
  • Transações de banco de dados são projetadas para falhar, então é preciso sempre usar um loop de tentativas
    • É bom adicionar Context ao loop de transação para permitir cancelamento
  • sqlc tem algumas limitações importantes e pequenos incômodos, então vale checar a lista de issues antes de usar
    • Não oferece suporte a consultas dinâmicas, relações um-para-muitos, CTEs embutidas, tipos compostos etc.
    • Serve bem para requisitos simples, mas para tarefas complexas é melhor usar uma abordagem manual
  • Ao executar Go dentro de contêineres, é preciso configurar GOMAXPROCS corretamente para evitar throttling de CPU
  • Usar GOMEMLIMIT pode reduzir a preocupação com o GC
    • Pode ser configurado automaticamente ao usar Kubernetes ou Docker
  • html/template é estranho e tem muitos problemas, então é melhor não usar
    • Em vez disso, a preferência é pelo Templ
  • Foi bom ver menção a roteamento
    • Estava acostumado com mux há muito tempo, mas não tinha prestado atenção aos recursos das novas releases
  • Usou Go por um mês em um novo emprego, mas odiou
    • Go parece não ter aprendido nada com os últimos 20 anos de desenvolvimento de linguagens
    • O problema do nil faz até tarefas simples ficarem complicadas
  • Ao usar SQLite, é melhor ter um pool de escrita de thread única e outro pool separado para leitura
    • É possível melhorar a concorrência com BEGIN CONCURRENT
  • Adora a simplicidade do Go e o fato de não depender de frameworks
    • Dá para criar coisas excelentes só com a biblioteca padrão e bibliotecas de terceiros já consolidadas
    • Go é uma boa escolha para criar apps web ou ferramentas CLI
    • Gosta do tratamento explícito de erros
    • É muito fã de Go