Go run
O comando `go run` do Go é apresentado como um exemplo de como ferramentas simples podem fazer uma linguagem compilada parecer quase script-like, especialmente com convenções como `go run .` e busca automática de dependências. Os comentaristas contrastam isso com os ecossistemas de JavaScript/TypeScript, onde múltiplos runtimes, sistemas de módulos e gerenciadores de pacotes podem tornar tarefas básicas mais complexas, embora ferramentas mais novas como Deno e Bun tentem reduzir essa distância. A conversa destaca trade-offs mais amplos entre simplicidade e flexibilidade no design de linguagens, tratamento de erros, sistemas de build e gerenciamento de dependências.
Uso e convenções de go run
- Muitos observam que
go run main.godeixa de funcionar assim quemainé dividido em vários arquivos;go run .executa o pacote atual e funciona com múltiplos arquivos e subdiretórios (go run ./cmd/foo). - Vários reclamam que tutoriais enfatizam
go run file.goem vez do mais simples e escalávelgo run .. - Alguns gostariam que
go runsem argumentos detectasse automaticamente um pacote main como outros subcomandosgo, mas outros argumentam que isso seria ambíguo com vários binárioscmd/*. - Módulos adicionam atrito: muitas vezes é preciso estar na raiz do módulo para fazer
go run ., ou usar-Cpara mudar de diretório.
Simplicidade, convenções e curva de aprendizado
- Go é elogiado por um layout previsível: diretórios como pacotes,
cmd/para binários; navegar por bases de código desconhecidas tende a ser direto. - Outros acham que a fronteira entre “simples” e “complexo” é pouco intuitiva (por exemplo, precisar saber quando usar
go run .versusgo run path/to/main.go). - Há debate sobre o quanto as expectativas de linguagens anteriores devem moldar tutoriais e modelos mentais de Go.
Comparação com JS/TS e outros ecossistemas
- Alguns contrastam
go runcom o ecossistema do Node/TypeScript, citando fragmentação (npm, yarn, pnpm; CommonJS vs ESM; transpilaçao de TS, configuração de Jest/Babel). - Outros contrapõem que o Node já pode executar ESM (
.mjs), TS via ferramentas simples (tsc, loaders), e que ferramentas mais novas (Deno, Bun,tsx,npx) tornam a programação em TS igualmente fácil. - Rust com
cargo run, ferramentas de Python (Poetry), Nix e Bazel são mencionados como fluxos análogos de “build + run”.
Busca de dependências e segurança
- Um recurso destacado:
go runfaz o download automático de dependências a partir de caminhos de módulo. - Defensores gostam do fluxo de baixo atrito, argumentando que as versões ficam travadas por
go.mod/go.sume apoiadas pelo proxy do Go. - Críticos veem o download automático durante
runcomo um antipadrão de segurança/operação e preferem etapas explícitas de “buscar e depois executar”, especialmente para os primeiros downloads.
Visões mais amplas sobre Go
- Muitos elogiam a ferramenta do Go (uma única toolchain, binários estáticos, compilação cruzada, implantação simples; às vezes até dispensando Docker).
- Outros criticam a verbosidade no tratamento de erros do Go e a falta de recursos avançados de tipos em comparação com Rust ou TypeScript, embora alguns apreciem a explicitação.
- Go é visto como estando entre o Rust de baixo nível e o TS de alto nível, encaixando-se bem para serviços de backend e utilitários pequenos, mas não satisfazendo o gosto linguístico de todos.