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.go
和 user_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文件中的导包路径已经不报红,而且高亮了。