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


相关文章
|
4天前
|
开发框架 JSON .NET
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
|
4天前
|
Java 应用服务中间件 Apache
使用IDEA修改Web项目访问路径,以及解决Apache Tomcat控制台中文乱码问题
本文介绍了在IntelliJ IDEA中修改Web项目访问路径的步骤,包括修改项目、模块、Artifacts的配置,编辑Tomcat服务器设置,以及解决Apache Tomcat控制台中文乱码问题的方法。
9 0
使用IDEA修改Web项目访问路径,以及解决Apache Tomcat控制台中文乱码问题
|
18天前
|
移动开发 开发框架 小程序
开发H5程序或者小程序的时候,后端Web API项目在IISExpress调试中使用IP地址,便于开发调试
开发H5程序或者小程序的时候,后端Web API项目在IISExpress调试中使用IP地址,便于开发调试
|
19天前
|
开发框架 NoSQL 前端开发
在Winform项目和Web API的.NetCore项目中使用Serilog 来记录日志信息
在Winform项目和Web API的.NetCore项目中使用Serilog 来记录日志信息
|
4天前
|
开发框架 .NET API
如何在 ASP.NET Core Web Api 项目中应用 NLog 写日志?
如何在 ASP.NET Core Web Api 项目中应用 NLog 写日志?
|
4天前
|
开发框架 .NET API
.Net Core Console 项目如何使用 HttpClient 与 Web 服务通信
.Net Core Console 项目如何使用 HttpClient 与 Web 服务通信
|
4天前
|
应用服务中间件
2022年最新最详细在IDEA中配置Tomcat(含有详细图解过程)、建立使用IEDA建立一个Web项目的案例
这篇文章提供了在IntelliJ IDEA中配置Tomcat服务器的详细步骤,包括添加Tomcat Server、选择安装路径、添加项目Artifact,以及创建和展示Web项目的流程。
|
5天前
|
缓存 Java 应用服务中间件
2021年9月28日,老是遇到一些非常奇葩的问题。就离谱、好好的一个web项目就莫名奇妙坏了。
开发者在使用IDEA 2020编辑器搭建的SSM框架图书管理系统中,遇到删除功能异常问题,经过一系列尝试后发现是IDEA编译缓存导致的,最终通过重新编译项目解决了问题。
|
10天前
|
关系型数据库 Linux 网络安全
"Linux系统实战:从零开始部署Apache+PHP Web项目,轻松搭建您的在线应用"
【8月更文挑战第9天】Linux作为服务器操作系统,凭借其稳定性和安全性成为部署Web项目的优选平台。本文以Apache Web服务器和PHP项目为例,介绍部署流程。首先,通过包管理器安装Apache与PHP;接着创建项目目录,并上传项目文件至该目录;根据需要配置Apache虚拟主机;最后重启Apache服务并测试项目。确保防火墙允许HTTP流量,正确配置数据库连接,并定期更新系统以维持安全。随着项目复杂度提升,进一步学习高级配置将变得必要。
21 0
|
16天前
|
缓存 NoSQL 关系型数据库
Go - 开箱即用,WEB 界面一键安装,没有项目经验,可以拿这个练手
Go - 开箱即用,WEB 界面一键安装,没有项目经验,可以拿这个练手
31 0