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


相关文章
|
15天前
|
开发框架 JavaScript 前端开发
如何选择合适的Web开发框架?
【9月更文挑战第1天】如何选择合适的Web开发框架?
36 1
|
3天前
|
前端开发
【前端web入门第五天】01 结构伪类选择器与伪元素选择器
本文介绍了CSS中的结构伪类选择器和伪元素选择器。结构伪类选择器如`nth-child`可根据元素结构关系进行选择,例如将列表中首个`<li>`元素背景设为绿色。伪元素选择器用于创建装饰性内容。
|
9天前
|
Web App开发 前端开发 JavaScript
Web前端项目的跨平台桌面客户端打包方案之——CEF框架
Chromium Embedded Framework (CEF) 是一个基于 Google Chromium 项目的开源 Web 浏览器控件,旨在为第三方应用提供嵌入式浏览器支持。CEF 隔离了底层 Chromium 和 Blink 的复杂性,提供了稳定的产品级 API。它支持 Windows、Linux 和 Mac 平台,不仅限于 C/C++ 接口,还支持多种语言。CEF 功能强大,性能优异,广泛应用于桌面端开发,如 QQ、微信、网易云音乐等。CEF 开源且采用 BSD 授权,商业友好,装机量已超 1 亿。此外,GitHub 项目 CefDetector 可帮助检测电脑中使用 CEF
48 3
|
15天前
|
数据库 开发者 Java
颠覆传统开发:Hibernate与Spring Boot的集成,让你的开发效率飞跃式提升!
【8月更文挑战第31天】在 Java 开发中,Spring Boot 和 Hibernate 已成为许多开发者的首选技术栈。Spring Boot 简化了配置和部署过程,而 Hibernate 则是一个强大的 ORM 框架,用于管理数据库交互。将两者结合使用,可以极大提升开发效率并构建高性能的现代 Java 应用。本文将通过代码示例展示如何在 Spring Boot 项目中集成 Hibernate,并实现基本的数据库操作,包括添加依赖、配置数据源、创建实体类和仓库接口,以及在服务层和控制器中处理 HTTP 请求。这种组合不仅简化了配置,还提供了一套强大的工具来快速开发现代 Java 应用程序。
29 0
|
15天前
|
数据库 开发者 Java
Hibernate映射注解的魔力:实体类配置的革命,让你的代码量瞬间蒸发!
【8月更文挑战第31天】Hibernate 是一款出色的对象关系映射框架,简化了 Java 应用与数据库的交互。其映射注解让实体类配置变得直观简洁。本文深入剖析核心概念与使用技巧,通过示例展示如何简化配置。
23 0
|
15天前
|
数据库 开发者 Java
数据战争:Hibernate的乐观与悲观锁之争,谁将主宰并发控制的王座?
【8月更文挑战第31天】在软件开发中,数据一致性至关重要,尤其是在多用户并发访问环境下。Hibernate 作为 Java 社区常用的 ORM 框架,提供了乐观锁和悲观锁机制来处理并发问题。乐观锁假设数据不易冲突,通过版本号字段 (`@Version`) 实现;悲观锁则假定数据易冲突,在读取时即加锁。选择哪种锁取决于具体场景:乐观锁适合读多写少的情况,减少锁开销;悲观锁适合写操作频繁的场景,避免数据冲突。正确应用这些机制可提升应用程序的健壮性和效率。
25 0
|
15天前
|
Java Maven Android开发
解锁Web开发新技能:从零开始的Struts 2之旅——让你的Java编程之路更加宽广,首个应用实例带你飞!
【8月更文挑战第31天】对于初学者,掌握 Struts 2 框架不仅能提升 Web 开发能力,还能深入了解 MVC 架构。Struts 2 是一个基于 Servlet 的 Java 框架,提供表单验证、文件上传、国际化等功能,便于快速构建易维护的 Web 应用。本文通过示例演示如何从零开始搭建环境并创建一个简单的 Struts 2 项目,包括配置 `struts.xml`、编写 Action 类及视图文件,并配置 web.xml。通过这些步骤,你将学会基本的开发流程,为进一步学习高级功能打下基础。
27 0
|
15天前
|
Java 开发者 数据安全/隐私保护
Struts 2 拦截器机制震撼登场!紧跟技术热点,解锁高效开发密码,引发开发者情感共鸣
【8月更文挑战第31天】在 Java Web 开发中,Struts 2 框架凭借其强大功能和灵活性深受开发者喜爱。其中,拦截器机制是 Struts 2 的重要特性之一,它允许我们在请求处理过程中执行自定义操作,如日志记录、权限验证和数据转换等。拦截器通过实现 `com.opensymphony.xwork2.interceptor.Interceptor` 接口并在 `struts.xml` 中配置即可使用。合理利用拦截器可实现代码解耦与复用,提升开发效率和系统可维护性。框架还提供了如 `params` 和 `servletConfig` 等内置拦截器供开发者按需选用。
24 0
|
15天前
|
开发者 Java UED
大文件传输不再头疼:揭秘Struts 2如何轻松应对文件上传与下载难题!
【8月更文挑战第31天】在Web应用开发中,文件上传与下载至关重要。Struts 2作为主流Java EE框架,凭借Commons FileUpload及文件上传拦截器简化了相关操作。本文探讨Struts 2在文件传输上的优势,通过具体配置与代码示例,展示如何设置最大文件大小、使用`fileUpload`拦截器以及实现文件上传与下载功能。对于大文件传输,Struts 2不仅能够轻松应对,还支持上传进度显示,有效提升了用户体验。总体而言,Struts 2为文件传输提供了高效便捷的解决方案,助力开发者构建稳定可靠的Web应用。然而,在处理大文件时需兼顾网络带宽与服务器性能,确保传输顺畅。
36 0
|
15天前
|
开发者 Java 前端开发
Struts 2验证框架:如何让数据校验成为Web开发的隐形守护者?揭秘前后端一致性的秘诀
【8月更文挑战第31天】在现代Web开发中,数据验证对确保应用健壮性和良好用户体验至关重要。随着前后端分离架构的普及,保证数据校验一致性尤为关键。Struts 2 验证框架基于 JavaBean 验证 API(JSR 303/JSR 380),允许开发者通过注解或 XML 配置轻松定义验证规则,确保输入数据在执行业务逻辑前已通过验证。此外,Struts 2 支持与前端 JavaScript 验证相结合,确保前后端数据校验一致,提升用户体验。通过注解、XML 配置和资源文件,开发者可以轻松定义和调整验证规则,实现前后端一致的数据校验,提高应用健壮性。
25 0