Go语学习笔记 - 项目规范结构调整 | Web框架Gin(三)

简介: Go语学习笔记 - 项目规范结构调整 | Web框架Gin(三)

已经把配置文件和日志都加上了,更加符合项目的使用。


但是还是想把项目结构向类似java的mvc结构改造一下,这样后面的代码编写可以规范化,毕竟不可能所有的功能实现都放到main方法里面。


项目地址:github地址


路由层调整

在app/router目录内增加router.go和test_router.go两个文件。

image.png


其中router.go文件主要是提供初始化汇总的。


router.go代码如下:


package router
import "github.com/gin-gonic/gin"
func InitRouter(r *gin.Engine) {
  // 测试路由
  TestRouter(r)
}

test_router.go文件主要是配置test控制层的路由地址的。


test_router.go代码如下:


package router
import (
  "github.com/gin-gonic/gin"
  "learn-gin/app/controllers"
)
func TestRouter(r *gin.Engine) {
  r.GET("/", controllers.TestCtrl.HelloWorld)
  r.GET("/test/:name", controllers.TestCtrl.TestParam)
  r.GET("/test1", controllers.TestCtrl.TestDefaultParam)
  r.POST("/testPost", controllers.TestCtrl.TestPost)
  r.POST("/testPost2", controllers.TestCtrl.TestPostBody)
}

至于controllers相关内容下面会继续讲到。


控制层调整

在app/controllers目录下也增加两个文件controllers.go和test_controller.go。



image.png


其中controllers.go主要是将controller中的结构体进行对象声明,方便使用。


controllers.go的代码如下:


package controllers
var (
  TestCtrl = &TestController{}
)
test_controller.go的代码如下:
package controllers
import (
  "encoding/json"
  "github.com/gin-gonic/gin"
  "learn-gin/app/pojo/req"
  "learn-gin/app/services"
  "learn-gin/config/log"
  "net/http"
)
type TestController struct {
}
func (t *TestController) HelloWorld(context *gin.Context) {
  log.Logger.Info("测试HelloWorld接口")
  context.String(http.StatusOK, "hello world")
}
func (t *TestController) TestParam(context *gin.Context) {
  name := context.Param("name")
  log.Logger.Info("测试TestParam接口")
  context.String(http.StatusOK, "check param %s", name)
}
func (t *TestController) TestDefaultParam(context *gin.Context) {
  name := context.DefaultQuery("name", "张三")
  gender := context.Query("gender")
  log.Logger.Info("测试TestDefaultParam接口")
  context.String(http.StatusOK, "他叫%s,性别:%s", name, gender)
}
func (t *TestController) TestPost(context *gin.Context) {
  name := context.PostForm("name")
  nick := context.DefaultPostForm("nick", "leo")
  log.Logger.Info("测试TestPost接口")
  context.JSON(http.StatusOK, gin.H{
  "status": gin.H{
    "code":    http.StatusOK,
    "success": true,
  },
  "name": name,
  "nick": nick,
  })
}
func (t *TestController) TestPostBody(context *gin.Context) {
  var request req.TestPostRequest
  log.Logger.Info("测试TestPostBody接口")
  if err := context.ShouldBindJSON(&request); err != nil {
  log.Logger.Panic("参数异常")
  }
  if _, err := json.Marshal(request); err != nil {
  log.Logger.Panic("参数解析异常")
  }
  services.TestServ.PrintInfo(&request)
  context.JSON(http.StatusOK, gin.H{
  "code": http.StatusOK,
  "data": request,
  })
}

这里就复杂了,用到了services目录以及pojo目录,下面会提到。总体上就是把之前在main方法中实现的接口功能,移到了这里。


服务层调整

在app/services目录下增加services.go和test_service.go两个文件,和控制层一样。


image.png


其中services.go文件主要是将service中的结构体进行对象声明,方便使用。


services.go代码如下:


package services
var (
  TestServ = &Test{}
)
test_service.go代码如下:
package services
import (
  "fmt"
  "learn-gin/app/pojo/req"
)
type TestService interface {
  PrintInfo(req *req.TestPostRequest)
}
type Test struct {
}
func (t Test) PrintInfo(req *req.TestPostRequest) {
  fmt.Printf("测试数据,name=%s,age=%d\n", req.Name, req.Age)
}

可以看出,使用了接口,结构体Test实现了PrintInfo方法,可以结合test_controller.go文件理解一下逻辑。


实体调整

在服务层可以看到我们使用到了一个实体,TestPostRequest。我们在app/pojo下创建了一个req目录,增加了test_request.go文件。


image.png



test_request.go代码如下:


package req

type TestPostRequest struct {

Name string `json:"name"`

Age  int    `json:"age"`

}

main方法调整

将main方法调整为如下:


package main
import (
  "github.com/gin-gonic/gin"
  "learn-gin/app/router"
  "learn-gin/config/log"
  "learn-gin/config/toml"
)
func main() {
  log.InitLogger(toml.GetConfig().Log.Path, toml.GetConfig().Log.Level)
  log.Logger.Info("hahahah")
  log.Logger.Info("config", log.Any("config", toml.GetConfig()))
  r := gin.Default()
  router.InitRouter(r)
  r.Run(":8080")
}

验证一下

项目改好了,我们测试一下接口,启动截图如下。


image.png


执行testPosts接口截图如下。


image.png


正确的情况下,我们看一下日志。


image.png


看一下参数异常情况下的日志。


image.png


OK没啥问题。


小结

后面的话,考虑继续调整,看到了目前main函数里面的一些警告,慢慢来吧。


相关文章
|
1月前
|
程序员 Go
go语言中的控制结构
【11月更文挑战第3天】
107 58
|
29天前
|
缓存 JSON 监控
如何在项目中保证 Web 组件化的性能
保证 Web 组件化的性能需要从多个方面入手,综合运用各种优化方法和策略。通过持续的优化和改进,能够提高组件化的整体性能,为用户提供更好的体验,同时也有助于提高项目的开发效率和质量。
42 8
|
29天前
|
存储 前端开发 JavaScript
如何在项目中高效地进行 Web 组件化开发
高效地进行 Web 组件化开发需要从多个方面入手,通过明确目标、合理规划、规范开发、加强测试等一系列措施,实现组件的高效管理和利用,从而提高项目的整体开发效率和质量,为用户提供更好的体验。
32 7
|
1月前
|
监控 安全 测试技术
如何在实际项目中应用Python Web开发的安全测试知识?
如何在实际项目中应用Python Web开发的安全测试知识?
32 4
|
1月前
|
中间件 Go API
Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架
本文概述了Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架。
92 1
|
1月前
|
JavaScript 前端开发 开发工具
web项目规范配置(husky、eslint、lint-staged、commit)
通过上述配置,可以确保在Web项目开发过程中自动进行代码质量检查和规范化提交。Husky、ESLint、lint-staged和Commitlint共同作用,使得每次提交代码之前都会自动检查代码风格和语法问题,防止不符合规范的代码进入代码库。这不仅提高了代码质量,还保证了团队协作中的一致性。希望这些配置指南能帮助你建立高效的开发流程。
48 5
|
1月前
|
JavaScript 前端开发 数据安全/隐私保护
Web开发者必看:手把手教你如何轻松播放m3u8流地址,解锁视频播放新技能,让你的项目更上一层楼!
【10月更文挑战第23天】随着互联网技术的发展,m3u8格式因良好的兼容性和高压缩率被广泛用于网络流媒体传输。本文介绍如何在Web端播放m3u8流地址,包括引入视频播放器(如Video.js)、创建播放器容器、初始化播放器及播放m3u8流的具体步骤。此外,还涉及处理加密m3u8流的示例。
311 1
|
2月前
|
JSON 搜索推荐 API
Python的web框架有哪些?小项目比较推荐哪个?
【10月更文挑战第15天】Python的web框架有哪些?小项目比较推荐哪个?
80 1
|
2月前
|
监控 Java Maven
springboot学习二:springboot 初创建 web 项目、修改banner、热部署插件、切换运行环境、springboot参数配置,打包项目并测试成功
这篇文章介绍了如何快速创建Spring Boot项目,包括项目的初始化、结构、打包部署、修改启动Banner、热部署、环境切换和参数配置等基础操作。
164 0
|
NoSQL 关系型数据库 MySQL
【Go实战 | 电商平台】(2) 项目结构及配置文件初始化
文章目录 1. 必备环境与推荐软件 1.1 必备环境 1.2 推荐软件 2. 项目初始化 3. 配置文件初始化 3.1 config.ini 3.2 conf.go 3.3 main函数
198 0
【Go实战 | 电商平台】(2) 项目结构及配置文件初始化