创建Gin项目(小白向)

115 阅读1分钟

关于Go的环境配置

笔者的go版本是1.19.5

创建Gin项目

Gin官方为我们提供了参考文档。学习地址如下:gin-gonic.com/zh-cn/docs/ image.png 下载之前配置好国内的代理

GOPROXY=https://goproxy.cn,direct

image.png 下载gin

go get -u github.com/gin-gonic/gin

完成下载后,在go.mod中可以看到增加了新的依赖 image.png

engineConfig.json

{
  "engine_name": "socialnetwork_back_go",
  "engine_mode": "debug",
  "engine_host": "localhost",
  "engine_port": "3000"
}

需要再在utils中增加一个解析函数

type Config struct {
   EngineName string `json:"engine_name"`
   EngineMode string `json:"engine_mode"`
   EngineHost string `jsom:"engine_host"`
   EnginePort string `json:"engine_port"`
}

var _cfg *Config = nil

func ParseConfig(path string) (*Config, error) {
   file, err := os.Open(path)

   if err != nil {
      panic(err)
   }
   defer file.Close()

   reader := bufio.NewReader(file)
   decoder := json.NewDecoder(reader)
   decoder.Decode(_cfg)

   if err = decoder.Decode(&_cfg); err != nil { //参数时interfece类型,参数需要传入地址
      return nil, err
   }
   return _cfg, nil
}

配置路由router

func InitRouter(r *gin.Engine) {
   // public directory is used to serve static resources
   r.Static("/static", "./static")
   
   r.GET("/test/", controller.Test)
}

main.go中增加

// 初始化路由
router.InitRouter(engine)

解决跨域问题

main.go内增加

func main() {
    // 设置跨域 
    engine.Use(Cors())
}

// 跨域访问
func Cors() gin.HandlerFunc {
   return func(context *gin.Context) {
      method := context.Request.Method
      origin := context.Request.Header.Get("Origin")

      var headerKeys []string
      for key, _ := range context.Request.Header {
         headerKeys = append(headerKeys, key)
      }

      headerStr := strings.Join(headerKeys, ",")
      if headerStr != "" {
         headerStr = fmt.Sprintf("access-control-allow-origin, access-control-allow-headers, %s", headerStr)
      } else {
         headerStr = "access-control-allow-origin, access-control-allow-headers"
      }

      if origin != "" {
         context.Writer.Header().Set("Access-Control-Allow-Origin", "*")
         context.Writer.Header().Set("Access-Control-Allow-Methods", "*")
         context.Writer.Header().Set("Access-Control-Allow-Headers", "*")
         context.Writer.Header().Set("Access-Control-Max-Age", "3600")
         context.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
         //context.Set("content-type", "application/json") // 设置返回格式是json
      }

      if method == "OPTIONS" {
         context.JSON(http.StatusOK, "Options Request!")
      } else {
         // 处理请求
         context.Next()
      }

   }
}

完整的main.go内容

func main() {
   //解析配置文件
   cfg, err := utils.ParseConfig("./config/engineConfig.json")
   if err != nil {
      panic(err.Error())
   }

   engine := gin.Default()
   // 初始化路由
   router.InitRouter(engine)
   // 设置跨域
   engine.Use(Cors())
   // 运行web服务
   pprof.Register(engine)
   // EngineHost是项目的运行地址, EnginePort是项目运行的端口
   engine.Run(cfg.EngineHost + ":" + cfg.EnginePort)
}

运行项目

终端执行

go run main.go

image.png image.png

测试项目的运行

通过Apifox发送Get请求成功获得响应 image.png