// 删除 func DeleteUser() gin.HandlerFunc { return func(c *gin.Context) { //username := c.Param("username") username := c.Query("username") for _, user := range dao.UsersDB { if user.Username == username { //usersDB = append(usersDB[:i], usersDB[i+1:]...) //usersDB = usersDB[:i+copy(usersDB[:i], usersDB[i+1:])] delete(dao.UsersDB, username) c.JSON(http.StatusOK, gin.H{"message": "用户删除成功"}) return } } c.JSON(http.StatusNotFound, gin.H{"error": "找不到该用户"}) } },这是一个用户增删改查的删除功能做一个分层,
时间: 2024-03-10 19:48:55 浏览: 73
首先,我们可以将路由层和处理函数层分开,以提高代码的可维护性和可读性。在路由层中,定义一个 HTTP DELETE 请求的路由,将该路由绑定到处理函数层的删除函数。在处理函数层,定义一个删除用户的函数,该函数接收用户名参数,并根据用户名从数据访问层中查询并删除对应的用户。最后,处理函数层向客户端返回删除操作的结果。
示例代码如下:
路由层:
```go
router.DELETE("/users/:username", userHandler.DeleteUser)
```
处理函数层:
```go
type UserHandler struct {
dao dao.UserDao
}
func NewUserHandler(dao dao.UserDao) *UserHandler {
return &UserHandler{dao: dao}
}
func (h *UserHandler) DeleteUser(c *gin.Context) {
username := c.Param("username")
err := h.dao.DeleteUser(username)
if err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"message": "用户删除成功"})
}
```
数据访问层:
```go
type UserDao interface {
DeleteUser(username string) error
}
type UserDB struct {
users map[string]User
mu sync.Mutex
}
func NewUserDB() *UserDB {
return &UserDB{users: make(map[string]User)}
}
func (db *UserDB) DeleteUser(username string) error {
db.mu.Lock()
defer db.mu.Unlock()
if _, ok := db.users[username]; !ok {
return fmt.Errorf("找不到该用户")
}
delete(db.users, username)
return nil
}
```
在这个示例中,我们将删除用户的处理函数 `DeleteUser` 分离到了一个单独的结构体 `UserHandler` 中。`UserHandler` 中的 `dao` 字段用于访问数据访问层。`DeleteUser` 函数中,我们首先从请求参数中获取要删除的用户名,然后调用数据访问层的 `DeleteUser` 函数删除对应的用户。如果删除用户时发生错误,我们将向客户端返回一个 HTTP 404 NotFound 状态码。如果删除成功,我们将向客户端返回一个 HTTP 200 OK 状态码。
在数据访问层中,我们定义了一个 `UserDao` 接口和一个 `UserDB` 类型。`UserDao` 接口中包含一个 `DeleteUser` 函数,用于删除指定的用户。`UserDB` 类型中包含一个 `users` 字段,用于存储用户数据,以及一个 `mu` 字段,用于保证并发安全。`DeleteUser` 函数中,我们首先获取写锁,然后检查用户是否存在。如果用户不存在,我们将返回一个错误。否则,我们将删除对应的用户并释放写锁。
这样,我们就实现了一个分层的用户删除功能。在实际的项目中,我们可以将其他功能的处理函数也封装到类似的结构体中,以实现更好的代码组织和可维护性。
阅读全文