Go语言Gin框架基础知识代码示例(2) | 青训营笔记

112 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天

此处主要记录一些项目的结构

1,将路由分开写成不同文件

  • 项目结构如下

    image.png

  • 项目代码如下

1.sayHI

package routers

import (
   "github.com/gin-gonic/gin"
   "net/http"
)

func sayHI(ctx *gin.Context) {
   ctx.JSON(http.StatusOK, gin.H{
      "msg": "HI",
   })
}

func sayHIHI(ctx *gin.Context) {
   ctx.JSON(http.StatusOK, gin.H{
      "msg": "HIHI",
   })
}

// LoadHI 注意使用大写字母开头, LoadHI 将以上函数表达出去类似于nodejs中export,在 **main** 函数中直接将其调用
func LoadHI(engine *gin.Engine) {
   engine.GET("/HI", sayHI)
   engine.GET("/HIHI", sayHIHI)
}

2.sayHello


package routers

import (
   "fmt"
   "github.com/gin-gonic/gin"
)

func sayHello(ctx *gin.Context) {
   ctx.String(200, fmt.Sprintln("Hello"))
}

// LoadHello 与 sayHI 中一样
func LoadHello(engine *gin.Engine) {
   engine.GET("/Hello", sayHello)
}

3.main2.go(主函数)

package main

import (
   "Gin2/routers"
   "fmt"
   "github.com/gin-gonic/gin"
)

func main() {
   route := gin.Default()
   routers.LoadHello(route)
   routers.LoadHI(route)
   err := route.Run(":80")
   if err != nil {
      fmt.Println("ERROR")
      return
   }
}


2.当项目实在太大时

有时候项目规模实在太大,那么我们就更倾向于把业务拆分的更详细一些,例如把不同的业务代码拆分成不同的APP。

此时,项目结构如下:

image.png

请忽略马赛克,只需要其他几个便可

  • app下存放不同路由,其他文件存放func函数;router文件用于将其定义相关信息,我理解为与nodejs一样负责导出
  • routers/routers文件中编写一个include方法一个init方法

sayBye.go

package sayGoodBye

import (
   "github.com/gin-gonic/gin"
   "net/http"
)

func sayBye(ctx *gin.Context) {
   ctx.JSON(http.StatusOK, gin.H{
      "msg": "Bye",
   })
}

func sayByeBye(ctx *gin.Context) {
   ctx.JSON(http.StatusOK, gin.H{
      "msg": "ByeBye",
   })
}

sayGoodBye/router.go

package sayGoodBye

import "github.com/gin-gonic/gin"

func Routers(e *gin.Engine) {
   e.GET("/BY", sayBye)
   e.GET("/BYBY", sayByeBye)
}

routers/routers.go

package routers

import "github.com/gin-gonic/gin"

// Option 自定义类型
type Option func(engine *gin.Engine)

var ops []Option

// Include 将所有路由添加进ops切片里面
func Include(opts ...Option) {
   ops = append(ops, opts...)
}


// Init 初始化 返回指针赋值给main函数的路由

func Init() *gin.Engine {
   r := gin.New()
//运用for方法遍历,其实此处每个opt都是一个router,
   for _, opt := range ops {
      opt(r)
   }
   return r
}

main函数如下

package main

import (
   "Gin2/app/sayGoodBye"
   "Gin2/app/sayHI"
   "Gin2/routers"
   "fmt"
)

func main() {
   routers.Include(sayGoodBye.Routers, sayHI.Routers)
   r := routers.Init()
   err := r.Run(":80")
   if err != nil {
      fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
      fmt.Printf("Error: %t\n", err)
      return
   }

   //fmt.Println("SUCCESS")
}

剩下一个sayHI路由一样,省略不写。。。

本作者作为初学者,如有错误理解有误,欢迎指正,不胜感激!

我是看到这篇文章才写的,原文->