Go-Gin Web 框架完整教程

打印 上一主题 下一主题

主题 574|帖子 574|积分 1722

1. 情况准备

1.1 Go 情况安装

Go 语言(或称 Golang)是一个开源的编程语言,由 Google 开辟。在开始使用 Gin 框架之前,我们必要先安装 Go 情况。
安装步骤:

  • 访问 Go 官网下载页面:https://golang.org/dl/
  • 根据你的操作系统选择相应的安装包

    • Windows:下载 .msi 安装包,双击运行安装程序
    • Mac:下载 .pkg 安装包,双击运行安装程序
    • Linux:下载 tar.gz 包,解压并配置情况变量

安装完成后,打开终端输入以下下令验证安装:
  1. go version
复制代码
如果显示 Go 版本号,阐明安装乐成。
1.2 设置 Go 情况变量

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


  • GOPATH:Go 工作空间的路径,存放 Go 项目代码和依赖包
  • GOROOT:Go 安装目录的路径
  • PATH:必要将 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
复制代码
配置阐明:


  • GOPATH 是你的工作目录,所有的 Go 项目都会在这个目录下
  • 将 $GOPATH/bin 添加到 PATH 中,这样你就能直接运行 Go 安装的工具
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
复制代码
这个下令会:


  • 下载 Gin 框架的最新版本
  • 将依赖信息添加到 go.mod 文件
  • 天生 go.sum 文件记录依赖的具体版本
注意
无法毗连到 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 是七牛云提供的国内镜像源,也可以选择其他镜像:


  • https://goproxy.io
  • https://mirrors.aliyun.com/goproxy/
  • https://athens.azurefd.net
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             # 依赖管理文件
复制代码
目录阐明:


  • config:存放配置文件,如数据库毗连信息、应用程序设置等
  • controllers:处理 HTTP 请求,调用相应的 service 处理业务逻辑
  • middleware:存放中央件,如登录验证、日志记录、错误处理等
  • models:界说数据模子,对应数据库表结构
  • routes:配置 URL 路由规则
  • services:实现业务逻辑
  • utils:存放通用的工具函数
  • main.go:程序入口文件
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. }
复制代码
代码阐明:

  • gin.Default():创建一个默认的 Gin 引擎,包含了 Logger 和 Recovery 中央件
  • r.GET("/"):界说了一个 GET 请求的路由处理器
  • gin.Context:包含了请求的上下文信息
  • c.JSON():返回 JSON 格式的响应
  • r.Run(":8080"):在 8080 端口启动服务器
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. }
复制代码
控制器阐明:

  • c.Param():获取 URL 参数
  • c.ShouldBindJSON():将请求体绑定到结构体
  • c.JSON():返回 JSON 响应
  • HTTP 状态码的使用:

    • 200 (OK):乐成获取资源
    • 201 (Created):乐成创建资源
    • 400 (Bad Request):请求格式错误

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. }
复制代码
路由阐明:

  • 路由分组:使用 r.Group() 创建路由组,方便管理相关的路由
  • RESTful API 设计:

    • GET /users/:id:获取特定用户
    • POST /users:创建新用户

  • 路由参数::id 是动态参数,可以在控制器中通过 c.Param("id") 获取
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. }
复制代码
中央件阐明:

  • gin.HandlerFunc:中央件函数类型
  • c.Next():调用下一个处理函数
  • 日志记录:

    • 请求方法 (GET, POST 等)
    • 请求路径
    • 客户端 IP
    • 处理时间

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. }
复制代码
主函数阐明:

  • 引入须要的包:中央件和路由
  • 创建 Gin 引擎
  • 应用中央件:使用 r.Use() 全局应用中央件
  • 设置路由:调用路由设置函数
  • 启动服务器:在指定端口监听请求
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企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

梦应逍遥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表