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