从零搭建Gin的web项目


Go语言(又称 Golang)是谷歌公司开发的强类型,编译型语言。Go 语言语法与 C相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。其实Go语言在2009就推出了,似乎不温不火。但是最近一两年在中国范围内,确实被关注的一塌糊涂。Go语言适合做服务端开发,web开发。本文将使用Go语言的Gin框架搭建一个web微服务工程。

Go环境搭建

官方下载地址:https://golang.org/dl/ 。国外的地址貌似很难打开,可通过网盘下载 go1.14.1 版本,地址: https://pan.baidu.com/s/1rVLxkycsTADIsxglJx51NA 提取码: 97b9 。下载完毕后就傻瓜式安装吧

这一步可选择Go的安装路径,其余都Next直到安装完毕。打开windows终端,输入 go version 出现版本号则说明已经安装成功

安装Gin

这里使用go module管理go的依赖包,go module也是官方推荐的go第三方包管理工具。咱们在 GOPATH 之外的地方,新建一个空文件夹 my_go_web ,然后执行以下命令

go mod init my_go_web

执行成功后会输出:go: creating new go.mod: module go-gin-api。这时目录中会多出一个go.mod文件,内容如下


module my_go_web

go 1.14

require github.com/gin-gonic/gin v1.6.2

注意module后面紧跟的my_go_web是当前项目的模块名,使用go module管理工程,在项目中导包时都需要使用模块名导包。

项目目录结构

Web 服务体系结构是构建每个项目之前的第一个阶段,就像您准备构建房屋并从创建体系结构计划开始一样。保持简单但直观的体系结构非常重要,因为众所周知,在 golang 中,您可以通过引用包名称来调用方法。开始先来约定一下项目的目录结构

.
├── src
│   ├── config
│   │   ├── mysql
│   │   └── redis
│   ├── cmd
│   │   └── main.go
│   ├── controller
│   │   ├── car_controller.go
│   │   ├── user_controller.go
│   │   ├── login.go
│   │   ├── system.go
├── dao
│   └── user_dao.go
├── model
│   ├── user_model.json
│   ├── car_model.json
├── route
│   └── web_route.go
├── service
│   ├── user.json
│   └── car.json
├── util
│   ├── date_util.go
├── go.mod
├── go.sum
├── main.go

构建项目

main.go

package main

import (
    "my_go_web/src/route"
)

func main() {
/*    r := gin.Default()
    r.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "pong",
        })
    })*/
    router := route.RegisterWebRoute()
    router.Run(":8082") // listen and serve on 0.0.0.0:8080
}

main函数中可以直接注册接口,但当接口数量越来越多时,就会显得代码混乱。为了代码整洁,把接口注册的地方抽离到一个go文件中。main函数中只保留服务启动的配置信息

web_route.go

package route

import (
    "github.com/gin-gonic/gin"
    "my_go_web/src/controller"
)

func RegisterWebRoute() *gin.Engine {

    router := gin.Default()
    // 加载html文件,即template包下所有文件
    //router.LoadHTMLGlob("template/*")

    //router.GET("/hello", hello)

    userRouter := router.Group("/user")
    userRouter.GET("/query", controller.QueryUser)
    // 更新产品
    userRouter.POST("/delete/:id", controller.DeleteUser)

    fileRouter := router.Group("/car")
    fileRouter.GET("/list", controller.CarList)
    // 更新产品
    fileRouter.POST("/info", controller.CarInfo)


    return router
}

在 java的spring中可以通过把controller注解放在类上实现根路由,在gin中可以通过 router.Group 创建一个根路由。在根路由下添加多个子路由。然后分别创建 car_controller.gouser_controller.go 。这样就实现和 java 一样的效果,把不同模块的功能聚合在它自己的controller中,下面是两个controller的代码实现

car_controller.go

package controller

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

func CarList(context *gin.Context) {
    context.JSON(200,gin.H{
        "car": "奔驰",
        "age":23,
    })
}

func CarInfo(context *gin.Context) {
        context.JSON(200,gin.H{
            "car": "奔驰",
            "length":"2m",
        })
}

user_controller.go

package controller

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

func QueryUser(context *gin.Context) {
    context.JSON(200,gin.H{
        "name": "张三",
        "age":23,
    })
}

func DeleteUser(context *gin.Context) {
    id := context.Param("id")
    context.JSON(200,gin.H{
        "result":id,
    })
}

这样就用go实现了一个简单web服务,下面启动服务

可以看到服务已经正常启动在8082端口,同时从控制台可以看到服务注册的全部路由和每个路由的请求类型,在浏览器中请求一些 /user/query 接口

请求返回了数据!我们已经成功的搭建了一个go语言的web服务

遇到的坑

引入gin的包时会出现,引用路径变红的问题。这时项目可以正常启动,但是看着代码报红,有强迫症的我很不舒服,按照网上的一些方法,例如执 go mod vendor 命令。这个命令是将项目依赖的包,放到项目的 vendor 目录中,执行完成后,项目的根路径下会出现一个 vendor 目录

执行这个命令后,发现项目导包仍然报错,而项目依赖下只有sdk,没有go mod依赖的模块。

解决方案

新建一个项目,创建项目的时候不要选择go modules ! ! !。仅创建一个普通的go项目

项目创建好后,把原来那个项目里面的东西copy过来,删除vendor目录,这个目录用不上了。然后再打开setting,把go mod勾选上

然后,在项目的依赖中就会出现go mod依赖的库了,这时在看go文件中的导包路径已经不报红,而且高亮了。


Author: 顺坚
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source 顺坚 !
评论
 Previous
λ演算与函数式编程 λ演算与函数式编程
最近在阅读一些JS开源组件的源码时,感觉有些吃力。原因在于源码的写法非常娴熟,充分的利用了JS语言函数式的特性,代码老练。虽然我使用JS也有几个年头了,但是仅仅停留在前端页面的一些字段校验和简单逻辑上,没有深入的去理解函数式编程思想。随着近
2020-04-12
Next 
spring-boot注解大全 spring-boot注解大全
spring boot是后端开发最主流的框架,spring boot的核心之一就是注解,它提供了很多注解来帮助我们简化配置,通过各种组合注解,极大地简化了spring项目的搭建和开发。为了方便我们在日常开发注解的使用,本文将开发所需要的注解
2020-04-04
  TOC