É 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)

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...

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. ```go 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) ```bash -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" ```
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.
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).
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

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.