gin学习

初始化 Go 模块

在项目根目录下执行以下命令来初始化 Go 模块:

go 复制代码
go mod init <module-name>

这将会创建一个 go.mod 文件,用于管理项目的依赖。

安装 Gin 框架

在项目根目录下执行以下命令来安装 Gin 框架:

go 复制代码
go get -u github.com/gin-gonic/gin

这将会安装最新版本的 Gin 框架及其依赖。

接下来使用Gin框架创建了一个简单的Web服务器

go 复制代码
package main
//package main:声明这是一个可执行程序的入口包。
//import "github.com/gin-gonic/gin":导入Gin框架,用于快速构建Web应用。
import "github.com/gin-gonic/gin"

func main() {
    router := gin.Default()
    //gin.Default():创建一个默认的Gin引擎实例,该实例包含了日志和恢复中间件

    router.GET("/", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "Hello, Gin!",
        })
    })
    	//router.GET("/", ...):定义一个HTTP GET请求的路由,当访问根路径/时,执行后面的匿名函数。
		//func(c *gin.Context) {...}:这是一个处理函数,c *gin.Context是Gin的上下文对象,用于处理请求和响应。
		//c.JSON(200, gin.H{...}):返回一个JSON响应,状态码为200(表示成功),JSON数据为{"message": "Hello, Gin!"}。

    router.Run(":8080")
    //router.Run(":8080"):启动Gin服务器,监听本地的8080端口。
}
go 复制代码
type H map[string]interface{}

gin.H是一个类型别名,其本质是map[string]interface{}。

运行程序

go 复制代码
go run main.go

参数化路由和路由组

go 复制代码
package main

import (
	"github.com/gin-gonic/gin"
)

func main() {
	router := gin.Default()

	// 参数化路由
	router.GET("/users/:id", func(c *gin.Context) {
		id := c.Param("id")
		c.String(200, "User ID: %s", id)
	})
//c.Param("id"):从请求的 URL 中获取 id 参数的值。
//c.String(200, "User ID: %s", id):返回一个状态码为 200 的响应,内容是格式化后的字符串,显示用户的 ID。




//router.Group("/api/v1"):创建一个路由组,所有在这个组内定义的路由都会以 /api/v1 作为前缀。
//组内定义了四个不同的路由处理函数,分别处理 GET、POST、PUT 和 DELETE 请求,用于列出用户、创建用户、更新用户和删除用户。
	// 路由组
	v1 := router.Group("/api/v1")
	{
		v1.GET("/users", func(c *gin.Context) {
			c.String(200, "List of users")
		})
		v1.POST("/users", func(c *gin.Context) {
			c.String(200, "Create a user")
		})
		v1.PUT("/users/:id", func(c *gin.Context) {
			id := c.Param("id")
			c.String(200, "Update user with ID: %s", id)
		})
		v1.DELETE("/users/:id", func(c *gin.Context) {
			id := c.Param("id")
			c.String(200, "Delete user with ID: %s", id)
		})
	}

	router.Run(":8080")
}

模板渲染

go 复制代码
 
package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	router := gin.Default()

	// 加载模板文件
	//router.LoadHTMLGlob("templates/*"):让Gin引擎加载 templates 目录下的所有模板文件。
	router.LoadHTMLGlob("templates/*")

	// 定义路由处理函数,渲染模板
	router.GET("/hello", func(c *gin.Context) {
		c.HTML(http.StatusOK, "hello.tmpl", gin.H{
			"title": "Hello, Gin!",
		})
	})
//c.HTML(...):使用Gin的 HTML 方法渲染模板。
//http.StatusOK:表示HTTP状态码200,即请求成功。
//"hello.tmpl":指定要渲染的模板文件名。
//gin.H{"title": "Hello, Gin!"}:传递给模板的数据,是一个键值对的映射,这里传递了一个 title 键,值为 "Hello, Gin!"。

	router.Run(":8080")
}

在 "/hello" 路由处理函数中,我们使用 c.HTML 方法渲染了名为 "hello.tmpl" 的模板,并传递了一个包含标题信息的数据。

静态文件服务

go 复制代码
 
package main

import "github.com/gin-gonic/gin"

func main() {
	router := gin.Default()

	// 从相对路径 "assets" 提供静态文件
	router.Static("/static", "./assets")

	// 从绝对路径 "/tmp" 提供静态文件
	router.StaticFS("/static2", http.Dir("/tmp"))

	// 提供单个静态文件
	router.StaticFile("/favicon.ico", "./resources/favicon.ico")

	router.Run(":8080")
}
  • router.Static("/static", "./assets"):将 /static 路径映射到当前目录下的 assets 文件夹,客户端可以通过访问 /static 开头的URL来获取 assets 文件夹中的静态文件。
  • router.StaticFS("/static2", http.Dir("/tmp")):将 /static2 路径映射到 /tmp 目录,使用 http.D 函数将目录转换为文件系统对象。
  • router.StaticFile("/favicon.ico", "./resources/favicon.ico"):将 /favicon.ico 路径映射到 ./resources/favicon.ico 文件,客户端访问该URL时会返回这个图标文件。

JSON解析与绑定

go 复制代码
package main

import (
	"github.com/gin-gonic/gin"
)

type User struct {
	Username string `json:"username"`
	Password string `json:"password"`
}
//定义了一个名为User的结构体,包含两个字段:Username和Password。
//json:"username"和json:"password"是结构体标签,用于在JSON序列化和反序列化时指定字段的名称。

func main() {
	router := gin.Default()

	router.POST("/login", func(c *gin.Context) {
		var user User
		if err := c.ShouldBindJSON(&user); err != nil {
			c.JSON(400, gin.H{"error": err.Error()})
			return
		}
		//c.ShouldBindJSON(&user):尝试将请求的JSON数据绑定到user变量上。如果绑定失败,返回一个HTTP 400错误,并将错误信息以JSON格式返回。

		// 根据用户输入的用户名和密码进行验证
		// ...

		c.JSON(200, gin.H{"message": "Login successful"})
	})

	router.Run(":8080")
}

自定义错误处理函数

自定义全局中间件

.Use:注册一个全局中间件。

c.Next():调用后续的处理函数。

len(c.Errors) > 0:检查在处理请求过程中是否发生了错误。

c.JSON:如果有错误,返回一个HTTP 500状态码和包含错误信息的JSON响应。

c.Next() 的作用是调用后续的中间件和处理函数。
当执行到 c.Next() 时,Gin会暂停当前中间件的执行,接着去执行后续的中间件和路由函数,等后续的处理完成之后,
再返回来继续执行当前中间件里 c.Next() 之后的代码。

c.Next() 的顺序不可以更改到检查错误之后,要保证它在检查错误之前执行,这样才能捕获到后续处理过程中产生的错误。

在Gin里,中间件是按照注册的先后顺序依次执行的。当你使用 Use 方法注册多个中间件时,Gin会按照注册顺序依次调用这些中间件

go 复制代码
 
package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	router := gin.Default()

	// 自定义全局中间件处理错误
	router.Use(func(c *gin.Context) {
		c.Next()

		// 检查是否有发生错误
		if len(c.Errors) > 0 {
			// 自定义错误处理
			c.JSON(http.StatusInternalServerError, gin.H{"error": "服务器内部错误"})
		}
	})

	router.GET("/ping", func(c *gin.Context) {
		// 模拟处理过程中发生错误
		c.Error(gin.Error{Err: errors.New("处理过程中发生错误")})
	})

	router.Run(":8080")
}

使用 Gin 框架的日志功能

Gin 框架默认集成了日志功能

go 复制代码
package main

import (
    "io"
    "net/http"
    "os"

    "github.com/gin-gonic/gin"
)

func main() {
    // 将日志输出到文件
    f, err := os.Create("gin.log")
    if err != nil {
        panic(err)
    }
    gin.DefaultWriter = io.MultiWriter(f, os.Stdout)

    router := gin.Default()

    router.GET("/ping", func(c *gin.Context) {
        c.String(http.StatusOK, "pong")
    })

    router.Run(":8080")
}

os.Create("gin.log"):创建一个名为 gin.log 的文件,如果文件已存在则会被覆盖。

gin.DefaultWriter = io.MultiWriter(f, os.Stdout):将Gin框架的默认输出设置为同时写入文件 gin.log 和标准输出(控制台)。

部署到生产环境

将 Gin 应用程序部署到生产环境通常涉及以下步骤:

  1. 编译应用程序:首先,你需要将 Gin 应用程序编译为可执行文件。你可以使用 Go 的内置工具或者其他构建工具来完成这个步骤。

  2. 配置服务器:选择一个适合的服务器作为部署目标,比如 Nginx 或 Apache。配置服务器以便它可以与你的 Gin

    应用程序进行交互,并且可以处理静态文件、负载均衡等。

  3. 设置环境变量:在生产环境中,你可能需要设置不同的环境变量来配置应用程序的行为,比如数据库连接信息、日志级别等。

  4. 启动应用程序:将编译好的应用程序部署到服务器上,并启动它。你可以使用类似 systemd 或 Supervisor

    的工具来管理应用程序的运行。

  5. 监控和日志:配置监控系统和日志记录,以便及时发现问题并进行故障排除。

相关推荐
STLearner13 小时前
AI论文速读 | U-Cast:学习高维时间序列预测的层次结构
大数据·论文阅读·人工智能·深度学习·学习·机器学习·数据挖掘
黑客思维者14 小时前
LLM底层原理学习笔记:Adam优化器为何能征服巨型模型成为深度学习的“速度与稳定之王”
笔记·深度学习·学习·llm·adam优化器
kk哥889915 小时前
Swift底层原理学习笔记
笔记·学习·swift
AA陈超16 小时前
Lyra学习004:GameFeatureData分析
c++·笔记·学习·ue5·虚幻引擎
zkl_zkl_17 小时前
地理信息系统学习笔记——第六章 空间数据采集与处理
笔记·学习·数据处理·数据质量·空间数据
光头程序员17 小时前
学习笔记——主攻 vite
笔记·学习
零匠学堂202517 小时前
移动学习系统,如何提升企业培训效果?
java·开发语言·spring boot·学习·音视频
TL滕18 小时前
从0开始学算法——第四天(题目参考答案)
数据结构·笔记·python·学习·算法
Hoshino.4118 小时前
从0开始学习Linux——第七部分:DNS(1)
linux·网络·学习
TL滕19 小时前
从0开始学算法——第四天(练点题吧)
数据结构·笔记·学习·算法