ToB企服应用市场:ToB评测及商务社交产业平台

标题: Go-Gin Web 框架完整教程 [打印本页]

作者: 梦应逍遥    时间: 2025-1-25 02:09
标题: Go-Gin Web 框架完整教程
1. 情况准备

1.1 Go 情况安装

Go 语言(或称 Golang)是一个开源的编程语言,由 Google 开辟。在开始使用 Gin 框架之前,我们必要先安装 Go 情况。
安装步骤:
安装完成后,打开终端输入以下下令验证安装:
  1. go version
复制代码
如果显示 Go 版本号,阐明安装乐成。
1.2 设置 Go 情况变量

Go 项目的工作效率很大水平上依赖于正确的情况变量配置。以下是主要的情况变量:

配置方法:
  1. # Linux/Mac(添加到 ~/.bashrc 或 ~/.zshrc)
  2. export GOPATH=$HOME/go
  3. export PATH=$PATH:$GOPATH/bin
  4. # Windows(系统环境变量)
  5. set GOPATH=C:\Users\YourName\go
  6. set PATH=%PATH%;%GOPATH%\bin
复制代码
配置阐明:

2. 项目初始化

2.1 创建项目目录

起首,我们必要创建一个新的项目目录。这个目录将包含我们所有的项目文件:
  1. mkdir my-gin-app
  2. cd my-gin-app
复制代码
这里 my-gin-app 是项目名称,你可以根据自己的需求修改。
2.2 初始化 Go 模块

Go 模块是 Go 管理依赖的方式。使用以下下令初始化一个新的 Go 模块:
  1. go mod init my-gin-app
复制代码
这个下令会创建一个 go.mod 文件,它用于:

2.3 安装 Gin 框架

Gin 是一个用 Go 语言编写的 Web 框架。使用以下下令安装:
  1. go get -u github.com/gin-gonic/gin
复制代码
这个下令会:

注意
无法毗连到 Go 的默认署理服务器。在国内访问 golang.org 经常会遇到这个问题。我们可以通过使用国内镜像源来办理:
  1. # 设置 GOPROXY 环境变量
  2. # Windows PowerShell
  3. $env:GOPROXY = "https://goproxy.cn,direct"
  4. # Windows CMD
  5. set GOPROXY=https://goproxy.cn,direct
  6. # Linux/Mac
  7. export GOPROXY=https://goproxy.cn,direct
复制代码
设置完后,重新运行:
  1. go get -u github.com/gin-gonic/gin
复制代码
补充阐明:
goproxy.cn 是七牛云提供的国内镜像源,也可以选择其他镜像:

3. 项目结构

一个好的项目结构能够提高代码的可维护性和可读性。以下是推荐的项目结构:
  1. my-gin-app/
  2. ├── config/             # 配置文件目录
  3. │   ├── config.go      # 配置结构体定义
  4. │   └── database.go    # 数据库配置
  5. ├── controllers/        # 控制器目录,处理请求和响应
  6. │   ├── user.go        # 用户相关控制器
  7. │   └── product.go     # 产品相关控制器
  8. ├── middleware/         # 中间件目录
  9. │   ├── auth.go        # 认证中间件
  10. │   └── logger.go      # 日志中间件
  11. ├── models/            # 数据模型目录
  12. │   ├── user.go        # 用户模型
  13. │   └── product.go     # 产品模型
  14. ├── routes/            # 路由配置目录
  15. │   └── routes.go      # 路由定义
  16. ├── services/          # 业务逻辑目录
  17. │   ├── user.go        # 用户相关业务逻辑
  18. │   └── product.go     # 产品相关业务逻辑
  19. ├── utils/             # 工具函数目录
  20. │   ├── jwt.go         # JWT 工具
  21. │   └── validator.go   # 验证工具
  22. ├── main.go            # 应用程序入口
  23. └── go.mod             # 依赖管理文件
复制代码
目录阐明:

4. 基础示例

4.1 创建入口文件

入口文件 main.go 是应用程序的起点。下面是一个基础的示例:
  1. package main
  2. import (
  3.     "github.com/gin-gonic/gin"
  4.     "net/http"
  5. )
  6. func main() {
  7.     // 创建默认的 gin 引擎
  8.     r := gin.Default()
  9.     // 定义一个简单的路由
  10.     r.GET("/", func(c *gin.Context) {
  11.         c.JSON(http.StatusOK, gin.H{
  12.             "message": "Hello, Gin!",
  13.         })
  14.     })
  15.     // 启动服务器
  16.     r.Run(":8080")
  17. }
复制代码
代码阐明:
4.2 添加控制器

控制器负责处理具体的业务逻辑。创建 controllers/user_controller.go:
  1. package controllers
  2. import (
  3.     "github.com/gin-gonic/gin"
  4.     "net/http"
  5. )
  6. // 定义用户结构体
  7. type User struct {
  8.     ID   string `json:"id"`
  9.     Name string `json:"name"`
  10. }
  11. // 获取用户信息
  12. func GetUser(c *gin.Context) {
  13.     id := c.Param("id")  // 获取 URL 参数
  14.     user := User{
  15.         ID:   id,
  16.         Name: "Test User",
  17.     }
  18.     c.JSON(http.StatusOK, user)
  19. }
  20. // 创建新用户
  21. func CreateUser(c *gin.Context) {
  22.     var user User
  23.     // 绑定 JSON 请求体到 user 结构体
  24.     if err := c.ShouldBindJSON(&user); err != nil {
  25.         c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  26.         return
  27.     }
  28.     c.JSON(http.StatusCreated, user)
  29. }
复制代码
控制器阐明:
4.3 配置路由

路由界说了 URL 和处理函数之间的映射关系。创建 routes/routes.go:
  1. package routes
  2. import (
  3.     "my-gin-app/controllers"
  4.     "github.com/gin-gonic/gin"
  5. )
  6. func SetupRoutes(r *gin.Engine) {
  7.     // 用户相关路由
  8.     userGroup := r.Group("/users")
  9.     {
  10.         userGroup.GET("/:id", controllers.GetUser)
  11.         userGroup.POST("/", controllers.CreateUser)
  12.     }
  13. }
复制代码
路由阐明:
4.4 添加中央件

中央件用于在请求处理过程中执行一些通用的操作。创建 middleware/logger.go:
  1. package middleware
  2. import (
  3.     "github.com/gin-gonic/gin"
  4.     "time"
  5.     "log"
  6. )
  7. func Logger() gin.HandlerFunc {
  8.     return func(c *gin.Context) {
  9.         startTime := time.Now()
  10.         // 处理请求
  11.         c.Next()
  12.         // 计算耗时
  13.         endTime := time.Now()
  14.         latency := endTime.Sub(startTime)
  15.         // 记录日志
  16.         log.Printf("[%s] %s %s %v",
  17.             c.Request.Method,    // HTTP 方法
  18.             c.Request.URL.Path,  // 请求路径
  19.             c.ClientIP(),        // 客户端 IP
  20.             latency)            // 请求耗时
  21.     }
  22. }
复制代码
中央件阐明:
5. 完整应用示例

更新 main.go 以整合所有组件:
  1. package main
  2. import (
  3.     "my-gin-app/middleware"
  4.     "my-gin-app/routes"
  5.     "github.com/gin-gonic/gin"
  6. )
  7. func main() {
  8.     // 创建 gin 引擎
  9.     r := gin.Default()
  10.     // 使用自定义中间件
  11.     r.Use(middleware.Logger())
  12.     // 设置路由
  13.     routes.SetupRoutes(r)
  14.     // 启动服务器
  15.     r.Run(":8080")
  16. }
复制代码
主函数阐明:
6. 常用功能示例

6.1 查询参数处理

  1. r.GET("/search", func(c *gin.Context) {
  2.     query := c.Query("q")    // 获取查询参数
  3.     page := c.DefaultQuery("page", "1")  // 带默认值的查询参数
  4.    
  5.     c.JSON(http.StatusOK, gin.H{
  6.         "query": query,
  7.         "page": page,
  8.     })
  9. })
复制代码
6.2 表单处理

  1. r.POST("/form", func(c *gin.Context) {
  2.     name := c.PostForm("name")
  3.     email := c.PostForm("email")
  4.    
  5.     c.JSON(http.StatusOK, gin.H{
  6.         "name": name,
  7.         "email": email,
  8.     })
  9. })
复制代码
6.3 文件上传

  1. r.POST("/upload", func(c *gin.Context) {
  2.     file, _ := c.FormFile("file")
  3.    
  4.     // 保存文件
  5.     c.SaveUploadedFile(file, "uploads/"+file.Filename)
  6.    
  7.     c.JSON(http.StatusOK, gin.H{
  8.         "message": "File uploaded successfully",
  9.         "filename": file.Filename,
  10.     })
  11. })
复制代码
6.4 分组路由

  1. v1 := r.Group("/api/v1")
  2. {
  3.     v1.GET("/users", GetUsers)
  4.     v1.POST("/users", CreateUser)
  5. }
  6. v2 := r.Group("/api/v2")
  7. {
  8.     v2.GET("/users", GetUsersV2)
  9.     v2.POST("/users", CreateUserV2)
  10. }
复制代码
7. 数据库集成(以 GORM 为例)

起首安装 GORM:
  1. go get -u gorm.io/gorm
  2. go get -u gorm.io/driver/mysql
复制代码
创建数据库毗连:
  1. package models
  2. import (
  3.     "gorm.io/gorm"
  4.     "gorm.io/driver/mysql"
  5. )
  6. var DB *gorm.DB
  7. func InitDB() {
  8.     dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
  9.     db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
  10.     if err != nil {
  11.         panic("Failed to connect to database")
  12.     }
  13.     DB = db
  14. }
复制代码
8. 测试

创建测试文件 main_test.go:
  1. package main
  2. import (
  3.     "net/http"
  4.     "net/http/httptest"
  5.     "testing"
  6.     "github.com/gin-gonic/gin"
  7.     "github.com/stretchr/testify/assert"
  8. )
  9. func TestPingRoute(t *testing.T) {
  10.     router := setupRouter()
  11.     w := httptest.NewRecorder()
  12.     req, _ := http.NewRequest("GET", "/ping", nil)
  13.     router.ServeHTTP(w, req)
  14.     assert.Equal(t, 200, w.Code)
  15.     assert.Equal(t, `{"message":"pong"}`, w.Body.String())
  16. }
复制代码
9. 摆设

9.1 编译

  1. go build -o app
复制代码
9.2 运行

  1. ./app
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4