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": "[email protected]"}'
-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": "[email protected]"}'
-X DELETE "http://localhost:8080/users/1"