下面是一个使用 Go 语言和 Gin 框架实现的简单 CRUD(创建、读取、更新、删除)项目的目录结构和示例代码。假设我们有一个简单的用户管理系统。
目录结构
user-crud/
├── .gitignore
├── go.mod
├── go.sum
├── main.go
├── internal/
│ ├── app/
│ │ ├── middleware/
│ │ ├── router/
│ │ ├── service/
│ │ ├── repository/
│ │ ├── model/
│ │ └── config/
│ └── pkg/
│ ├── utils/
│ └── constants/
├── scripts/
├── Dockerfile
└── tests/
├── unit/
└── integration/
示例代码
internal/app/model/user.go
package model
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email"`
Password string `json:"-"`
}
internal/app/repository/user_repository.go
package repository
import (
"database/sql"
"errors"
"user-crud/internal/app/model"
)
type UserRepository interface {
Create(user *model.User) error
GetByID(id int) (*model.User, error)
Update(user *model.User) error
Delete(id int) error
}
type userRepository struct {
db *sql.DB
}
func NewUserRepository(db *sql.DB) UserRepository {
return &userRepository{db: db}
}
// ... 实现 Create, GetByID, Update, Delete 方法 ...
internal/app/service/user_service.go
package service
import (
"user-crud/internal/app/model"
"user-crud/internal/app/repository"
)
type UserService interface {
Create(user *model.User) error
GetByID(id int) (*model.User, error)
Update(user *model.User) error
Delete(id int) error
}
type userService struct {
userRepo repository.UserRepository
}
func NewUserService(userRepo repository.UserRepository) UserService {
return &userService{userRepo: userRepo}
}
// ... 实现 Create, GetByID, Update, Delete 方法 ...
internal/app/router/user_router.go
package router
import (
"net/http"
"github.com/gin-gonic/gin"
"user-crud/internal/app/service"
)
func SetupUserRoutes(router *gin.Engine, userService service.UserService) {
user := router.Group("/users")
{
user.POST("/", createUserHandler(userService))
user.GET("/:id", getUserHandler(userService))
user.PUT("/:id", updateUserHandler(userService))
user.DELETE("/:id", deleteUserHandler(userService))
}
}
func createUserHandler(userService service.UserService) gin.HandlerFunc {
return func(c *gin.Context) {
var user model.User
if err := c.ShouldBindJSON(&user); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
if err := userService.Create(&user); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusCreated, user)
}
}
// ... 实现 getUserHandler, updateUserHandler, deleteUserHandler ...
main.go
package main
import (
"database/sql"
"log"
"net/http"
"github.com/gin-gonic/gin"
_ "github.com/go-sql-driver/mysql"
"user-crud/internal/app/router"
"user-crud/internal/app/service"
"user-crud/internal/app/repository"
)
func main() {
db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/dbname?charset=utf8mb4&parseTime=True")
if err != nil {
log.Fatal(err)
}
defer db.Close()
router := gin.Default()
userService := service.NewUserService(repository.NewUserRepository(db))
router.Use(gin.Logger())
router.Use(gin.Recovery())
router.GET("/ping", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "pong"}) })
router.POST("/users", router.Group("/").Use(router.MiddlewareFunc()).POST("/users", router.Group("/").Use(router.MiddlewareFunc()), router.Group("/").Use(router.MiddlewareFunc()), createUserHandler(userService)))
router.Run(":8080")
}
说明
- model: 定义用户模型。
- repository: 实现用户数据的存储和检索。
- service: 提供用户服务接口,调用 repository 进行数据操作。
- router: 设置路由和处理函数。
- main.go: 初始化数据库连接,设置路由并启动服务器。
请注意,上述代码仅为示例,实际项目中需要根据具体需求进行扩展和优化。
前端工程师、程序员

浙公网安备 33010602011771号