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函数里面的一些警告,慢慢来吧。


相关文章
|
11天前
|
程序员 Go
go语言中的控制结构
【11月更文挑战第3天】
87 58
|
14天前
|
缓存 前端开发 中间件
go语言中Web框架
【10月更文挑战第22天】
26 4
|
16天前
|
JavaScript 前端开发 开发工具
web项目规范配置(husky、eslint、lint-staged、commit)
通过上述配置,可以确保在Web项目开发过程中自动进行代码质量检查和规范化提交。Husky、ESLint、lint-staged和Commitlint共同作用,使得每次提交代码之前都会自动检查代码风格和语法问题,防止不符合规范的代码进入代码库。这不仅提高了代码质量,还保证了团队协作中的一致性。希望这些配置指南能帮助你建立高效的开发流程。
33 5
|
2月前
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
Go语言的条件控制语句及循环语句的学习笔记
本文是Go语言的条件控制语句和循环语句的学习笔记,涵盖了if语句、if-else语句、if嵌套语句、switch语句、select语句以及for循环和相关循环控制语句的使用方法。
Go语言的条件控制语句及循环语句的学习笔记
|
2月前
|
前端开发
【前端web入门第五天】01 结构伪类选择器与伪元素选择器
本文介绍了CSS中的结构伪类选择器和伪元素选择器。结构伪类选择器如`nth-child`可根据元素结构关系进行选择,例如将列表中首个`<li>`元素背景设为绿色。伪元素选择器用于创建装饰性内容。
|
2月前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
3月前
|
Cloud Native JavaScript API
一文读懂云原生 go-zero 微服务框架
一文读懂云原生 go-zero 微服务框架
|
2月前
|
消息中间件 NoSQL Go
PHP转Go系列 | ThinkPHP与Gin框架之Redis延时消息队列技术实践
【9月更文挑战第7天】在从 PHP 的 ThinkPHP 框架迁移到 Go 的 Gin 框架时,涉及 Redis 延时消息队列的技术实践主要包括:理解延时消息队列概念,其能在特定时间处理消息,适用于定时任务等场景;在 ThinkPHP 中使用 Redis 实现延时队列;在 Gin 中结合 Go 的 Redis 客户端库实现类似功能;Go 具有更高性能和简洁性,适合处理大量消息。迁移过程中需考虑业务需求及系统稳定性。
|
2月前
|
人工智能 算法 搜索推荐
Go学习笔记-代码调
近年来,人工智能技术飞速发展,Cody作为由Sourcegraph开发的一款AI驱动编码助手,应运而生。它不仅提供代码预测与补全,还能深度理解代码上下文,为开发者提供准确建议,提升编码效率和质量。Cody能识别潜在错误并提出修复建议,缩短调试时间,同时进行智能代码审查,帮助优化代码结构和风格。未来,随着AI技术进步,Cody将不断学习优化,成为开发者不可或缺的伙伴,推动编程领域的创新与发展。
33 0