Gin 框架在实践中学习 ~ 够浪|Go主题月

1,796 阅读3分钟

学习之始

环境安装

studygolang.com/dl 下载对应二进制,下一步下一步安装。

配置加速

原因访问外网, go 拉去依赖模块会很慢

Mac、 Linux 配置

以阿里云代理为例

vim  .bash_profile

export GO111MODULE="on"
export GOPROXY="https://mirrors.aliyun.com/goproxy/"

// 重新生效
source .bash_profile

Win 配置

$env:GO111MODULE="on"
$env:GOPROXY="https://mirrors.aliyun.com/goproxy/"

校验环境

终端输入 go env

hellogo.go

package main

import "fmt"

func main() {
	fmt.Println("Hello Golang ...")
}
  • package main 包名称
  • import xxx 导入报名
  • func xxx 运行主函数
  • fmt.函数名称 调用 fmt 包函数,打印 "Hello Golang ..."

实践中学习

使用 Gin 提供一个可以访问的服务

Golang 有很多web服务框架,可以选择 Beego Iris

初始化项目 mooose-go

- moose-go
-- main.go

根据 gin 文档创建 gin 对象提供服务

package main

import (
	"fmt"

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

func main() {
	initApp()
}

func initApp() {

	gin.SetMode("debug")

	app := gin.Default()

	app.Run("0.0.0.0:8090")
}
  • 创建 main.go ,初始化 gin,可以设置一些 gin 参数

  • 主入口文件必须包含一个 main 函数

  • app := xxx ,:= 用来定义变量

  • 运行 go run main.go 服务会跑在 8090 端口上

创建访问路由

这个访问路由其实就是调用的 api 地址 ---> url

创建 router - > router.go 管理路由

package router

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

func InitRouter(app *gin.Engine) {

}

挂载到 gin 上

修改 main.go

import (
	"fmt"
  
  // 导入 router
	"moose-go/router"

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


....

	app := gin.Default()

// 添加上这一行
	router.InitRouter(app)

	app.Run("0.0.0.0:8090")

...
  • 使用 router,传递 gin 对象,方便操作使用 gin

创建访问 url --> Controller

controller 目录 -> v1 目录 --> user_controller.go

package v1

import (
	"moose-go/common"

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

type UserController struct {
}

func (uc *UserController) RegisterRouter(engine *gin.Engine) {
	group := engine.Group("/api/v1/user")
	group.GET("/list", uc.List)
}

func (uc *UserController) List(c *gin.Context) {
	
}
  • 结构体 UserController 对应表示一类,用来区分管理;类似 java 中的 class 创建对象
  • uc *UserController *XXX 表示一个指针对象
  • 函数 RegisterRouter 用来创建路哟欧规则,挂载到 gin 引擎上
  • group := engine.Group("/api/v1/user") 表示一组,
  • 在后面写 group.GET("/list", uc.List) 就可以访问全路径 /api/v1/user/list
  • uc.List 为实际处理业务逻辑函数,接收类型HandlerFunc`
  • c *gin.Context gin 上下文参数,可以获取访问请求到这个路径 url 一些参数

使用 UserController

router --> InitRouter 中添加为

func InitRouter(app *gin.Engine) {
	new(v1.UserController).RegisterRouter(app)
}
  • new 关键字,标示创建出 UserController 对象,把 UserController 挂在到 gin 引擎中

模拟返回用户信息列表

定义结构体 UserInfo

model 目录 UserInfo.go

package model

type UserInfo struct {
	UserId   int64  `json:"userId"`
	UserName string `json:"userName"`
	Phone    string `json:"phone"`
	Avatar   string `json:"avatar"`
}
  • type XXX struct {} 表示定义一个 XXX 结构体,可以用来封装数据

  • int64,string Go语言数据类型

  • bool、init、init8、int16、init32、init64、string、byte ...等用到了其他再说吧

  • json:"userName" tag中的第一个参数是用来指定别名,用于 JSON 解码和编码

完善 List 中逻辑

func (uc *UserController) List(c *gin.Context) {
	userList := make([]model.UserInfo, 0)
	for i := 0; i < 2; i++ {
		user := model.UserInfo{UserName: "测试用户", Phone: "1537898764", Avatar: "https://gitee.com/shizidada/moose-resource/raw/master/emoji/custom/over.jpeg"}
		userList = append(userList, user)
	}
  c.JSON(http.StatusOK, gin.H{
      "code":    http.StatusOK,
      "data":    userList,
      "message": "获取用户列表",
    })
 c.Abort()
}

make

make 和 new 都是内存的分配(堆上)

make 只用于 slice、map 以及 channel 的初始化(非零值);

new 用于类型的内存分配,并且内存置为零。

make 返回的是引用类型本身;new返回的是指向类型的指针

for 循环

在 go 中定义 for 循环 for i := 0; i < 2; i++ {}

user := model.UserInfo{} 结构体实例化 UserInfo 对象

append 用来给slice(切片)追加一个元素

  • 每次需要扩容的时候,容量并不是简单增长到足够容纳新的元素,而是会被进一步扩充成2n,原来的两倍

gin 返回JSON数据

// c gin.Context
// gin.H 为一个 map 类型
c.JSON(http.StatusOK, gin.H{
      "code":    http.StatusOK,
      "data":    userList,
      "message": "获取用户列表",
    })
 c.Abort()
  • http.StatusOK 返回请求状态码
  • gin.H 包装返回数据
  • c.Abort() 终止后面所有的该请求下的函数,返回结果

启动服务器

总结

在使用 Golang,和其他语言也很多相似的地方,待发现和学习跟多新的语法并运用
如何集成其他中间件(redis)数据库(msyql)Kafka 消息队列等等...还需要去探索学习