Go进阶 - Gin基础使用及实战
Go进阶 - Gin基础使用及实战
Gin介绍
Gin 是一个用于Go语言(Golang)的Web框架,提供了快速、简洁的HTTP Web服务器以及路由、中间件等必要功能。本笔记介绍了使用Gin构建Web应用程序的基础知识。
安装
要使用Gin,首先需要进行安装。打开终端并运行以下命令:
go get github.com/gin-gonic/gin
实例代码
以下是一个示例代码,演示了基本的用法:
package main
import (
"encoding/json"
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
//创建一个服务
ginServer := gin.Default()
//访问地址 处理请求
ginServer.GET("/hello", func(context *gin.Context) {
context.JSON(200, gin.H{"msg": "hello world"})
})
//加载静态页面
ginServer.LoadHTMLGlob("templates/*")
//渲染
ginServer.GET("/", func(context *gin.Context) {
context.HTML(http.StatusOK, "index.html", gin.H{
"msg": "hahahhahahaha",
})
})
//接受前端传递过来的参数
ginServer.GET("/user/info", func(context *gin.Context) {
userid := context.Query("userid")
username := context.Query("username")
context.JSON(http.StatusOK, gin.H{
"userid": userid,
"username": username,
})
})
//
ginServer.GET("/user/info/:userid/:username", func(context *gin.Context) {
userid := context.Param("userid")
username := context.Param("username")
context.JSON(http.StatusOK, gin.H{
"userid": userid,
"username": username,
})
})
//前端给后端传递Json
ginServer.POST("/json", func(context *gin.Context) {
//Json在request.body中
body, _ := context.GetRawData()
var m map[string]interface{} // 空接口 接受所有类型
_ = json.Unmarshal(body, &m)
context.JSON(http.StatusOK, m)
})
//Router
ginServer.GET("test", func(context *gin.Context) {
context.Redirect(301, "https://www.baidu.com")
})
//定义404页面
ginServer.NoRoute(func(context *gin.Context) {
context.HTML(http.StatusNotFound, "404.html", nil)
})
//路由组
userGroup := ginServer.Group("/user")
{
userGroup.GET("/add")
userGroup.GET("/login")
}
orderGroup := ginServer.Group("/order")
{
orderGroup.GET("/add")
orderGroup.GET("/delete")
}
//服务器端口 默认为8080
ginServer.Run(":8082") // 默认8080
}
Gin Gorm项目实战
概述
提供了一系列功能,包括发布帖子、查询页面信息等。使用了 Go 语言进行开发,并采用了 MVC(Model-View-Controller)架构模式,以实现代码结构的清晰和模块化。
项目结构
- controller:包含处理请求的控制器函数。
- models:包含与数据库交互的数据模型和数据访问对象。
- service:包含业务逻辑和服务流程的实现。
- router:包含路由初始化函数,用于定义和配置路由(组)等。
- main.go:应用程序的入口文件。
模型介绍
三个实体:主题(Topic)、帖子(Post)和用户(User)
关系
- 一个主题可以包含多个帖子,每个帖子都对应唯一的一个主题。
- 每个帖子都属于一个用户,即用户和帖子是一对一的关系。
- 每个主题也属于一个用户,即用户和主题是一对一的关系。
0基础
Dao?
数据访问对象(DAO),封装了对数据的操作。
- 分离数据访问逻辑:UserDao的存在可以将数据访问逻辑与业务逻辑分离。这样,业务逻辑层不需要关心具体的数据访问细节,只需要调用UserDao提供的方法来获取或修改用户数据。这样可以提高代码的可维护性和可测试性。
- 封装数据库操作:UserDao封装了对数据库的操作,包括查询、插入、更新等。这样,业务逻辑层不需要直接与数据库打交道,而是通过UserDao来进行数据库操作。这样可以降低业务逻辑层与数据库之间的耦合度,提高代码的灵活性和可扩展性。
- 提供统一的接口:UserDao提供了一组统一的接口方法来操作用户数据。这样,无论是查询单个用户还是批量查询用户,业务逻辑层都可以通过调用UserDao的方法来完成。这样可以提高代码的一致性和可读性。
Flow?
工作流(FLOW),封装了处理操作的顺序和流程。
- 控制数据操作流程:使用 Flow 可以更好地控制数据操作的流程和顺序。通过定义工作流,可以规定数据操作的先后顺序、条件判断和错误处理等。这样可以确保数据操作按照预期的流程执行,提高了代码的可靠性和稳定性。
- 简化复杂操作:对于复杂的数据操作,Flow 可以将其分解为一系列简单的步骤。每个步骤可以由独立的函数或方法来实现,使得代码更加模块化和可维护。通过定义工作流,可以按照特定的顺序执行这些步骤,并在需要时进行条件判断或错误处理。
- 提高代码可读性:使用 Flow 可以使代码更具可读性和可理解性。通过定义工作流,可以清晰地展示数据操作的流程和逻辑。这样,其他开发人员可以更轻松地理解代码的意图和执行顺序,从而提高团队协作和代码维护的效率。
sync.Once?
以UserDao为例,使用了 sync.Once 来确保 UserDao 的实例只创建一次。sync.Once 是 Go 语言标准库中的一个同步原语,它提供了一种安全且高效的方式来执行只需执行一次的操作。
在这种情况下,使用 sync.Once 的目的是确保 UserDao 的实例化操作只会执行一次,即使在并发环境下也能保证。这样可以避免多个 goroutine 同时执行实例化操作,造成重复创建实例或其他竞态条件的问题。

浙公网安备 33010602011771号