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),封装了对数据的操作。

  1. 分离数据访问逻辑:UserDao的存在可以将数据访问逻辑与业务逻辑分离。这样,业务逻辑层不需要关心具体的数据访问细节,只需要调用UserDao提供的方法来获取或修改用户数据。这样可以提高代码的可维护性和可测试性。
  2. 封装数据库操作:UserDao封装了对数据库的操作,包括查询、插入、更新等。这样,业务逻辑层不需要直接与数据库打交道,而是通过UserDao来进行数据库操作。这样可以降低业务逻辑层与数据库之间的耦合度,提高代码的灵活性和可扩展性。
  3. 提供统一的接口:UserDao提供了一组统一的接口方法来操作用户数据。这样,无论是查询单个用户还是批量查询用户,业务逻辑层都可以通过调用UserDao的方法来完成。这样可以提高代码的一致性和可读性。

Flow?

工作流(FLOW),封装了处理操作的顺序和流程。

  1. 控制数据操作流程:使用 Flow 可以更好地控制数据操作的流程和顺序。通过定义工作流,可以规定数据操作的先后顺序、条件判断和错误处理等。这样可以确保数据操作按照预期的流程执行,提高了代码的可靠性和稳定性。
  2. 简化复杂操作:对于复杂的数据操作,Flow 可以将其分解为一系列简单的步骤。每个步骤可以由独立的函数或方法来实现,使得代码更加模块化和可维护。通过定义工作流,可以按照特定的顺序执行这些步骤,并在需要时进行条件判断或错误处理。
  3. 提高代码可读性:使用 Flow 可以使代码更具可读性和可理解性。通过定义工作流,可以清晰地展示数据操作的流程和逻辑。这样,其他开发人员可以更轻松地理解代码的意图和执行顺序,从而提高团队协作和代码维护的效率。

sync.Once?

以UserDao为例,使用了 sync.Once 来确保 UserDao 的实例只创建一次。sync.Once 是 Go 语言标准库中的一个同步原语,它提供了一种安全且高效的方式来执行只需执行一次的操作。

在这种情况下,使用 sync.Once 的目的是确保 UserDao 的实例化操作只会执行一次,即使在并发环境下也能保证。这样可以避免多个 goroutine 同时执行实例化操作,造成重复创建实例或其他竞态条件的问题。

项目地址

CT

posted @ 2023-10-13 17:12  Jannan  阅读(457)  评论(0)    收藏  举报