一、安装GO

二、CURD代码

package main

import (
    "net/http"
    "strconv"

    "github.com/gin-gonic/gin"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

// ====================== 1. 模型定义 ======================
type User struct {
    gorm.Model        // 自带 ID、CreatedAt、UpdatedAt、DeletedAt
    Name     string   `json:"name" binding:"required"` // 姓名 必填
    Age      int      `json:"age" binding:"required"`  // 年龄 必填
    Email    string   `json:"email" gorm:"unique"`     // 邮箱 唯一
}

// ====================== 2. 全局DB ======================
var db *gorm.DB

// ====================== 3. 初始化数据库 ======================
func initDB() {
    // 请改成你的 MySQL 信息:用户名:密码@tcp(IP:端口)/库名?charset=utf8mb4&parseTime=True&loc=Local
    dsn := "root:abc@tcp(192.168.56.102:3306)/gin_curd?charset=utf8mb4&parseTime=True&loc=Local"
    var err error
    db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic("数据库连接失败:" + err.Error())
    }

    // 自动迁移表(没有表会自动创建)
    _ = db.AutoMigrate(&User{})
}

// ====================== 4. CURD 接口实现 ======================

// 1. 创建用户
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.StatusOK, gin.H{
        "message": "创建成功",
        "data":    user,
    })
}

// 2. 获取所有用户
func getUserList(c *gin.Context) {
    var users []User
    db.Find(&users)
    c.JSON(http.StatusOK, gin.H{
        "total": len(users),
        "data":  users,
    })
}

// 3. 根据 ID 获取单个用户
func getUserById(c *gin.Context) {
    id, _ := strconv.Atoi(c.Param("id"))
    var user User

    // 查找数据
    result := db.First(&user, id)
    if result.Error != nil {
        c.JSON(http.StatusNotFound, gin.H{"error": "用户不存在"})
        return
    }

    c.JSON(http.StatusOK, gin.H{"data": user})
}

// 4. 更新用户
func updateUser(c *gin.Context) {
    id, _ := strconv.Atoi(c.Param("id"))
    var oldUser User

    // 先查是否存在
    if err := db.First(&oldUser, id).Error; err != nil {
        c.JSON(http.StatusNotFound, gin.H{"error": "用户不存在"})
        return
    }

    // 绑定新数据
    var newUser User
    if err := c.ShouldBindJSON(&newUser); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": "参数错误"})
        return
    }

    // 更新
    db.Model(&oldUser).Updates(newUser)
    c.JSON(http.StatusOK, gin.H{"message": "更新成功"})
}

// 定义删除用户的函数
func deleteUser(c *gin.Context) {
    // 1. 从 URL 里拿到 id 参数,并把字符串转成 int
    id, _ := strconv.Atoi(c.Param("id"))

    // 2. 声明一个 User 结构体变量,用来存放从数据库查出来的用户
    var user User

    // 3. 根据 id 去数据库找这个用户
    // 如果找不到 → 返回 404 错误
    if err := db.First(&user, id).Error; err != nil {
        c.JSON(http.StatusNotFound, gin.H{"error": "用户不存在"})
        return
    }

    // 4. 找到了 → 执行删除(GORM 默认是软删除,不会真删掉数据)
    db.Delete(&user)

    // 5. 返回成功信息给前端
    c.JSON(http.StatusOK, gin.H{"message": "删除成功"})
}


// ====================== 5. 路由 ======================
func main() {
    // 初始化数据库
    initDB()

    // 创建 Gin 路由
    r := gin.Default()

    // 接口组
    userGroup := r.Group("/api/users")
    {
        userGroup.POST("", createUser)      // 创建
        userGroup.GET("", getUserList)      // 列表
        userGroup.GET("/:id", getUserById)  // 单个
        userGroup.PUT("/:id", updateUser)   // 更新
        userGroup.DELETE("/:id", deleteUser)// 删除
    }

    // 启动服务
    _ = r.Run(":8080")
}

go get卡住问题

打开powershell执行

$env:GO111MODULE="on"
$env:GOPROXY="https://goproxy.cn,direct"

参考

作者:admin  创建时间:2026-05-30 06:51
最后编辑:admin  更新时间:2026-05-31 07:04