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天】
106 58
|
1月前
|
中间件 Go API
Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架
本文概述了Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架。
84 1
|
1月前
|
缓存 前端开发 中间件
go语言中Web框架
【10月更文挑战第22天】
48 4
Go语言的条件控制语句及循环语句的学习笔记
本文是Go语言的条件控制语句和循环语句的学习笔记,涵盖了if语句、if-else语句、if嵌套语句、switch语句、select语句以及for循环和相关循环控制语句的使用方法。
Go语言的条件控制语句及循环语句的学习笔记
|
3月前
|
前端开发
【前端web入门第五天】01 结构伪类选择器与伪元素选择器
本文介绍了CSS中的结构伪类选择器和伪元素选择器。结构伪类选择器如`nth-child`可根据元素结构关系进行选择,例如将列表中首个`<li>`元素背景设为绿色。伪元素选择器用于创建装饰性内容。
103 8
|
3月前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
3月前
|
人工智能 算法 搜索推荐
Go学习笔记-代码调
近年来,人工智能技术飞速发展,Cody作为由Sourcegraph开发的一款AI驱动编码助手,应运而生。它不仅提供代码预测与补全,还能深度理解代码上下文,为开发者提供准确建议,提升编码效率和质量。Cody能识别潜在错误并提出修复建议,缩短调试时间,同时进行智能代码审查,帮助优化代码结构和风格。未来,随着AI技术进步,Cody将不断学习优化,成为开发者不可或缺的伙伴,推动编程领域的创新与发展。
36 0
|
4月前
|
消息中间件 缓存 API
go-zero微服务实战系列(三、API定义和表结构设计)
go-zero微服务实战系列(三、API定义和表结构设计)
|
4月前
|
缓存 监控 中间件
构建高效的Go语言Web服务器:基于Fiber框架的性能优化实践
在追求极致性能的Web开发领域,Go语言(Golang)凭借其高效的并发处理能力、垃圾回收机制及简洁的语法赢得了广泛的青睐。本文不同于传统的性能优化教程,将深入剖析如何在Go语言环境下,利用Fiber这一高性能Web框架,通过精细化配置、并发策略调整及代码层面的微优化,构建出既快速又稳定的Web服务器。通过实际案例与性能测试数据对比,揭示一系列非直觉但极为有效的优化技巧,助力开发者在快节奏的互联网环境中抢占先机。
|
4月前
|
算法 安全 Go