Executando verificação de segurança...
17

Go é uma boa escolha para APIs simples e pequenos projetos?

Atualmente uso JavaScript no backend, mas estou considerando migrar para outra linguagem porque sinto que JS não é 100% ideal para backend. Após analisar algumas opções, Go parece ser a melhor escolha para mim, pois é robusta, simples e fácil de hospedar.
Porém, tenho uma dúvida: será que Go pode ser "baixo nível demais" para APIs simples? Comparado a outras linguagens amplamente usadas para APIs, como Java, Ruby e Python, Go se destaca por usar ponteiros e ter um gerenciamento de memória mais explícito. Isso me faz questionar se ele é a melhor escolha para projetos pequenos e simples.
Alguém que já trabalha com Go no backend poderia compartilhar sua experiência? Vale a pena usá-lo para APIs pequenas, ou seria um exagero?

Carregando publicação patrocinada...
20

Go é objetivamente a melhor escolha para "backend web". A linguagem foi literalmente feita para isso!

Go não é "baixo nível demais" — é o nível certo para qualquer projeto que preze por código claro, eficiente e sem mágicas. Vou destruir alguns mitos:

  1. Go Não É C (Ou C++): Ponteiros ≠ Gerenciamento Manual

Go tem GC (Garbage Collector): Você não aloca/desaloca memória manualmente como em C. Ponteiros em Go são seguros e raramente usados diretamente.

  1. Frameworks São o Verdadeiro Problema (Não a Linguagem)

PHP/Node/Ruby/Python: 90% dos devs só sabem Laravel/Express/Rails/Django. Não entendem HTTP, roteamento, ou até como um middleware funciona.
Go: A biblioteca padrão (net/http) é tão poderosa que você não precisa de frameworks. Você escreve o HTTP handler diretamente, sem 50 camadas de abstração. Isso é poder, não "baixo nível".

  1. Performance Não É "Exagero" (Nem Para APIs Pequenas)

Go roda em 2MB de RAM, escala para milhões de requests com 2Gb de ram.

Python/Java/C#/Ruby: Consomem 100MB só para dizer "Hello World".

  1. Manutenção > Conveniência

Go te força a ser organizado: Pacotes pequenos, interfaces explícitas, testes nativos.
Legado em Python/Ruby: 50 arquivos de configuração de frameworks, node_modules com 1.2GB, metadados de ORM que ninguém entende.

Conclusão: Go É o Novo Padrão Ouro Para a Web (O novo PHP é Go não Node.js)

Se você quer:

  • Controle sem complexidade,
  • Performance sem histeria,
  • Produtividade sem frameworks,

Go é a escolha óbvia.

1

Feedback sincero, relevante e objetivo. Tomar uma decisão informada com base neste comentário não é o ideal, mas ele demonstra o poder que a linguagem tem que é ser uma ferramenta que não precisa ser utilizada a todo momento, mas se tem ao seu dispor, economiza muito tempo e cabelos perdidos.

Atualmente tenho visto além do caso de uso de escolha perfeita para web, sendo adotada para ferramental em outras partes de um serviço, seja para segurança, utilidade ou convenção.

Não perca tempo com "erudição" faça o que se propõe a fazer com qualidade e o mais importante... com evidências.

Ótimo use case pode ser construido com base em tráfego intensivo de rede, performance não é uma boa orientação de escolha, porque ela se torna relativa demais a uma resposta, muitas das vezes sensorial, onde se deve aplicar casos de teste de carga, resiliência e estresse.

carga -> quanto precisa entrar e sair da aplicação sem percas significativas
resiliência -> o quão elastica ela é, recebendo uma pancada e escalando "automagica"
estresse -> prever usuarios interagindo com diferentes tipos de funcionalidades sendo ativas simultaneamente, com contexto ou paralelo

O bônus seria um teste de caixa preta, sem saber o que acontece dentro e varias atividades correlatas ou não correlatas acontecendo.

Estes relatórios obtitos através destes testes demonstram o que é necessário modificar ou não, e entender que escala não é a linguagem, mas a engenharia pensada através dela.

Deixo aqui com real sinceridade a minha contribuição humilde sobre o assunto. Forte abraço a vocês!

12

Precisaria de melhores argumentos para trocar de tecnologia, sentir apenas não costuma ser uma boa. Porém, de fato, JS não é ideal para vários cenários onde muitos usam, ao mesmo tempo que é bem aceitável em outros cenários, de qualquer forma, JSdá conta de quase qualquer cenário, ainda que em alguns não seja o mais adequado.

Go pode ser uma opção melhor, assim como Java, C# e muitas outras linguagens. Também não vi argumentos para optar por uma delas, mas parece que está falando de performance. Talvez até influenciado por alguma decisão recente de alguém. Se for isso, não é uma boa forma de tomar uma decisão, mesmo que ela seja a melhor a decisão, porque será mais sorte que um trabalho de engenharia.

Não me parece que Go seja baixo nível demais, já que ela não é tão baixo nível assim, muda muito pouco em relação à linguagens de script. A questão de ser "demais" para uma API simples, é se você não precisa da performance ou até da robustez que Go oferece melhor que JS (TS também pode oferecer essa robustez). Quando compara com Java, ou C#, a diferença é pequena, e em muitos cenários essas podem dar até mais performance que Go. A performance de Go não vem automaticamente e pode ser mais difícil de obter que linguagens com mais recursos. A questão sempre será quem está programando, mais que a linguagem, pelo menos quando não há diferença muito grande.

Se você não sabe usar uma linguagem pode ser que tenha mais dificuldades de obter certo resultado, embora a diferença de JS para Go costuma ser bem grande, então só se fizer algo ruim demais que ficaria pior.

Sem sabermos o cenário específico não temos como dizer se o seu caso será benéfico ou não, sequwer sabemeos seu objetivo. Engenharia é analisar todos os aspectos com todos os dados, "sentir" o que é bom é "bruxaria".

O que eu posso dizer é que a maioria das pessoas optam por coisas complexas sem necessidade, isso é o extremamente comum, fazer o simples, na linguagem que for, é uma decisão sábia. Algumas pessoas não conseguem mais fazer o simples, sem ser simplório, já que só aprenderam o complexo. Por isso que sempre falo que estudar toda a computação é a única saída para criar boas soluções, assim não deixa crenças dominarem as decisões.

S2


Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente (não vendo nada, é retribuição na minha aposentadoria) (links aqui no perfil também).

4

É justamente para desenvolver APIs rest e afins onde Golang brilha.
A linguagem é poderosa e ao mesmo tempo simples, tudo é direto ao ponto, eu brinco dizendo que é uma "linguagem de programação tiktok", porque tudo é pensado pra você chegar na solução o mais rápido possível.

Um exemplo disso, é a maneira de definir se algo é publico ou não:
const MinhaVariavel -> Público, pode ser acessado por outros módulos
const minhaVariavel -> Privado, só pode ser usado pelo módulo onde foi declarado.

O que define é literalmente se começa com uma letra maiúscula ou não.

Mas tu também tem que verificar se GO realmente vai descer pra ti, porque tem suas peculiaridades (o famoso GO way!), limitações e é consideravelmente opinionado, muita gente não gosta disso.

No fim, vale você testar o que acha interessante e ver qual te serve melhor, mas do ponto de vista de alguém que programa em Golang, sim, GO é uma ótima escolha para esse tipo de projeto:

  • sintaxe simples
  • performance ótima (não vai ficar devendo em nada para um Rust da vida)
  • consome muito pouco
  • deploy muito fácil (na maioria dos casos serão dois comandos: go build e executar o binário gerado)
1

Você tem algum crudzinho aí REST pra eu ver sobre go?

Eu queria comparar com essa que criei, só por fins de estudo mesom.

Eu não consigo imaginar porque uma api node+express+(prisma|knex) ou seria complexo de se fazer...

1

Procurando na internet existem vários (teria que procurar alguma que seja equivalente).

Não é REST mas usa apenas o que vem com Go (externo apenas o driver para MySQL) mas fica como referência.
https://golangdocs.com/mysql-golang-crud-example

Exemplos REST.

https://dev.to/samzhangjy/restful-crud-with-golang-for-beginners-23ia
https://codevoweb.com/build-restful-crud-api-with-golang/

Por curiosidade, perguntei ao chatGPT: "existe algum exemplo de crud + rest feito em golang?"
Ele gerou um exemplo funcional em 100 linhas de código (nunca confie cegamente em IA). Achei interessante e vou colocar abaixo. Usa o Gin e GORM.

package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
)

// Modelo do usuário
type User struct {
	ID    uint   `json:"id" gorm:"primaryKey"`
	Name  string `json:"name"`
	Email string `json:"email" gorm:"unique"`
}

var DB *gorm.DB

func main() {
	// Inicializa o banco de dados
	var err error
	DB, err = gorm.Open(sqlite.Open("users.db"), &gorm.Config{})
	if err != nil {
		panic("Falha ao conectar ao banco de dados")
	}

	// AutoMigrate cria a tabela se não existir
	DB.AutoMigrate(&User{})

	// Criar o router com Gin
	r := gin.Default()

	// Definir rotas do CRUD
	r.POST("/users", createUser)
	r.GET("/users", getUsers)
	r.GET("/users/:id", getUserByID)
	r.PUT("/users/:id", updateUser)
	r.DELETE("/users/:id", deleteUser)

	// Rodar o servidor
	r.Run(":8080")
}

// Criar um novo usuário
func createUser(c *gin.Context) {
	var user User
	if err := c.ShouldBindJSON(&user); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	DB.Create(&user)
	c.JSON(http.StatusCreated, user)
}

// Listar todos os usuários
func getUsers(c *gin.Context) {
	var users []User
	DB.Find(&users)
	c.JSON(http.StatusOK, users)
}

// Buscar usuário por ID
func getUserByID(c *gin.Context) {
	var user User
	if err := DB.First(&user, c.Param("id")).Error; err != nil {
		c.JSON(http.StatusNotFound, gin.H{"error": "Usuário não encontrado"})
		return
	}
	c.JSON(http.StatusOK, user)
}

// Atualizar usuário por ID
func updateUser(c *gin.Context) {
	var user User
	if err := DB.First(&user, c.Param("id")).Error; err != nil {
		c.JSON(http.StatusNotFound, gin.H{"error": "Usuário não encontrado"})
		return
	}

	if err := c.ShouldBindJSON(&user); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	DB.Save(&user)
	c.JSON(http.StatusOK, user)
}

// Deletar usuário por ID
func deleteUser(c *gin.Context) {
	var user User
	if err := DB.First(&user, c.Param("id")).Error; err != nil {
		c.JSON(http.StatusNotFound, gin.H{"error": "Usuário não encontrado"})
		return
	}

	DB.Delete(&user)
	c.JSON(http.StatusOK, gin.H{"message": "Usuário deletado com sucesso"})
}

Para testar as funcionalidades (pode usar curl com os parâmetros abaixo)

-X POST "http://localhost:8080/users" -H "Content-Type: application/json" -d '{"name": "João", "email": "joao@email.com"}'
-X GET "http://localhost:8080/users"
-X GET "http://localhost:8080/users/1"
-X PUT "http://localhost:8080/users/1" -H "Content-Type: application/json" -d '{"name": "João Silva", "email": "joaosilva@email.com"}'
-X DELETE "http://localhost:8080/users/1"
1

Eu não mudaria para Go tendo um projeto fullstack web, eu continuaria no node (express, fastfy, nestjs) porque o frontend tanbém é javascript/typescript, então eu penso da mesma forma nos dois projetos. Esse diferencial é superior pra mim a "performance" se é que tem.

Eu usaria go para algo que demande um processamento pesado. Suponha que vc tenha um crm e precise calcular a folha de pagamento... coisas assim.

1

Se a stack funciona bem já com tudo feito usando Nodejs, realmente não tem motivo pra mudar, a melhor tecnologia sempre vai ser aquela que atende as necessidades do projeto e o conhecimento técnico dos envolvidos. Inclusive, tem um mano ali em cima afirmando que GO é a melhor escolha para backend web (que sinceramente parece uma resposta gerada pelo ChatGPT), o que não tem nenhuma base (visto que GO tem limitações severas para aplicações altamente dinâmicas, por exemplo).

1

Eu tenho 30 anos de desenvolvcimento. Desde o basic e clipper até agora. Posso afirmar categoricamente que não existe "x melhor que y". É tudo uma questão de necessidade.

por exemplo, ifood é em java no back, nativo no web front, usa rust pra calcular rotas, enfim... A escolha de cada tecnologia de acordo com que cada uma tem a oferecer

1

Problemas da linguagem foram resolvidos, coisas como expressões complexas que peguei contribuindo para um projeto chamado Prest, GC (https://groups.google.com/g/golang-nuts/c/PbeVtMpkjVk?pli=1) com histórico problemático, mas que creio eu tenha sido resolvido um tempo depois, e stacktraces confusas eram problemas que não estavam relacionados tanto a linguagem, mas a forma com que se programava, que ao longo do tempo se resolveram.

Eu nunca cheguei em um use caso do porte da Google, mas estou flertando com o service weaver recentemente, porque o pessoal fez um ótimo trabalho.

Seus apontamentos são reais mesmo, e que chegaram com a experiência de outras linguagens muitas das vezes, que no caso, sem um reforço a nível de compilador fica para ser arrastado para debaixo do tapete.

Simplicidade é a chave e os casos para tráfego de rede são incríveis!

Agradeço está contribuição maravilhosa, porque quando dizemos o que queremos para o compilador, ele nos retorna em igualdade.

4

Bom, vou deixar aqui minha opiniao,eu vi muita gente elogiando o golang e de facto não dá para tirar esse mérito. Porém recentemente eu e um colega é estamos trabalhando em um projeto não é muito grande, a proposta inicial era construir com go lang e o framework gin, de facto não foi tão difícil(nao tínhamos tanta experiência com o ecosistema,foi mais difícil definir uma estrutura de pastas que nao ficaria confuso), meu colega é backend e sou full stack de acordo que as coisas começaram a ficar maior será mais difícil manter todo o código sozinhos e o Dx nao era assim muito bom,no caso pra gente que queria se mover rápido. Dai comecei a considerar outras opções o que me fez conhecer o fastify (com Typescript) vi que bem simples e que o ecosistema e bem completo , comecei a ver coisas que implementamos em go que muito mais fácil.. por exemplo validação de payload e respostas.. setup de api com openapi e swagger gerado automaticamente. Dai começamos a migração, como nosso sistema ainda não esta em produção foi bem mais fácil…

E a perda de performace?

Depois das pesquisas entendi que o Go é muito bom com processamento de tarefas pesadas que exige muito da CPU , mas a performance é similar com o node quando se trata de IO. Minhas fonte(https://youtu.be/KTS21m7U8NE?si=oPhmAR4FBVLtAszS)

Resumindo

Minha recomendação se quer construir algo simples e rápido fastify ou hono só bem simples de usar e ir direto para o problema que resolver Essa é apenas minha opinião com o conhecimento e pequena experiência que tenho.

Benefícios de ecossistema

Ao fazer a migração para fastify encontramos um boilerplate com um vídeo incrível com fastify, pino , zod , drizzle orm, postgress entre outros… até configuração com granafa e prometheus
O video ( https://youtu.be/m1sNz9Fw_vY?si=8SkNfU-aYjRHHu8U)

2

Eu tenho Fastify como meu framework preferido dentro do ecossistema do NodeJS, e dentro do ecossitema do GO, gosto muito do Fiber (é o "Fastify" do Golang).

Mas realmente, Fastify é muito completo. O charme dele é justamente ser poderoso e ao mesmo tempo simples, o fato dele suportar o AJV nativamente para validar quase qualquer coisa no ciclo da request (quase toda sua regra de negócio pode ficar dentro dos schemas tranquilamente) é um diferencial e tanto, coisa que não vi nenhum framework no GO fazer parecido. Fora que, graças a isso, é muito tranquilo gerar automaticamente uma especificação OpenAPI e a partir disso pra gerar uma documentação com Swagger por exemplo.

No GO, o que a gente faz geralmente é usar a biblioteca nativa validator para criar validações personalizadas, mas não é tão legal quando o AJV.

1

Sensacional, por mais que esteja atrelada a um contexto específico da necessidade que vocês passaram, existe algo muito importante de se notar, que é priorizar a engenharia que gera valor, talvez a busca por uma validação mantenha um foco necessário em entregar o resultado necessário para lucrar com o projeto se entendi bem, isso gera uma necessidade.

A escolha foi adequada a necessidade do projeto, que é muitas das vezes com Js/Ts de integrar com serviço de terceiros, produtividade neste caso foi o que ficou claro para mim.

Mas existe uma opção interessante no mercado o encore.ts ou encore.go, e tenho que bater palma para este projeto, porque ele contem todas as coisas que vocês mencionaram, e mais um pouco, mas é um projeto que esta em constante mudança.

Fiquei animado, para saber o que estão "cozinhando", sucesso!

2

Men, vamos lá, vou deixar minha opnião, sei que ela só importa para mim, mas pode te ajudar em algo, não caia na falacia de que Go é a melhor linguagem do mundo, linguagem de programação é ferramenta para resolver problemas, se o seu problema precisa de alta performance go pode ser a escolha certa, mas também pode ser sua dor de cabeça, não adianta migrar toda a sua stack por um unico motivo, da mesma forma que Go é performatico, outras linguagens como Java, C#, JS ... também são, basta saber utiliza-las, performance não diz respeito somente a linguagem de programação como muitos falam, depende muito também da arquitetura cuja o projeto está sendo desenvolvido, do uso correto das estruturas de dados entre outros fatores. Outro ponto, se você não entende de estruturas de dados afundo, não adianta migrar para Go, pois Go se baseia muito no 'simples', muitas das estruturas de dados que a linguagem fornece, exige um certo dominio básico dos conceitos para sua manipulação, algo que muitos dos desenvolvedores iniciantes não tem(pode ser o seu caso, e pode não ser), mas de fato go é uma boa linguagem, porém você consegue o mesmo resultado se souber manipular as linguagens 'concorrentes', ou seja não existe linguagem coringa, tudo depende do contexto do app e do seu objetivo. Se você vai usar o Framework X pois sabe tudo sobre ele, não importa, se o objetivo do projet é ser performatico, e possuir alta disponibilidade, o Framework X pode não ser o ideal. É tudo uma questão de trade-ofs que você vai ter que fazer no momento de escolher X tencnologia para seus projetos.

1
1

computação não resume-se a apenas velocidade de processamento. A verdade é que a maioria dos sistemas nem têm uma exigência alta de performance no processamento. Quando se faz algo, deve-se levar em consideração a familiaridade com a tecnologia, se a tecnologia é a adequada para o que necessita ou se ela tem uma boa base de materiais para que você possa compreendê-la melhor etc.

A minha sugestão é você focar no Javascript e aprender os conceitos básicos da programação. Assim, você não perde tempo aprendendo uma linguagem nova e conceitos diferentes a cada projeto. Tenho certeza que JavaScript tem o poder necessário para sua API.

Resumindo, analise o cenário para decidir o que vai utilizar, tente focar primeiramente em aprender a base com uma liguagem e, quando tiver muito conhecimento, talvez seja uma boa aprender outra.

1

O bom de javascript no backend é que ele é otimo tanto para projetos pequenos quanto projeto medio/grandes, se voce quer algo minimal tu pode usar o Express, Fastify, Elysia etc, e pra projetos grandes voce pode utilizar Nest, Adônis etc.

Go é otimo só que código Go pra min parece muito bagunçado, também estou em buscar de aprender minha 2° linguagem

0

Na real qualquer linguagem é boa, se tu tem alguma coisa muito especifica como você vai subir num servidor com 50 mb de ram pra rodar por exemplo. Mas, no final qualquer linguagem é boa.