gin

开始

// main.go
func main() {
	r := gin.Default()
	r.LoadHTMLGlob("./templates/**/*")
	//r.LoadHTMLFiles("./templates/index/index.tmpl", "./templates/index/form.tmpl")
	r.GET("/", func)
	r.Run(":9000")
}

路由

// 普通
r.GET("/", func)

// 伪静态(:占位符必传,*占位非必传)
r.GET("/article/:id", func)
c.Param("id")

r.GET("/index/*page", func)
c.Param("page")

参数

// Get参数
id := c.Query("id")
id := c.QueryArray("id")
id := c.QueryMap("id")
id := c.DefaultQuery("id", "1")

// Post参数
username := c.PostForm("username")
id := c.PostFormArray("id")
idMap := c.PostFormMap("id_map")
password := c.DefaultPostForm("password", "123456")

文件

// 单文件
c.FormFile("file")
c.SaveUploadedFile(file, dst+filename+ext)

// 多文件
form, _ := c.MultipartForm()
files := form.File["upload[]"]

for _, file := range files {
	log.Println(file.Filename)
	// 上传文件至指定目录
	c.SaveUploadedFile(file, dst)
}

模板

// 注释
{{/* 注释 */}}

// 定义模板
{{ define "name" }}
{{ end }}

// 使用模板
{{ template "name" . }}

// 判断
{{ if .value }}
{{ else }}
{{ end }}

// 循环,支持 else
{{ range $k,$v := .value }}
{{ else }}
{{ end }}

// URL转码
{{ urlquery "https://www.example.com/" }}

// 获取 数组、map 指定值
{{ index .value key}}

// 都为真才会显示最后一个(一个为空那么整体为空,否则显示最后一个)
{{ and .name .age }}

// 显示第一个为真的
{{ or .name .age }}

// 布尔取反
{{ not .name }}

// 等于(eq支持多个参数,其他不支持。类似于PHP in_array函数)
{{ eq .num 17 }}

// 不等于
{{ ne .num 17 }}

// 小于
{{ lt .num 17 }}

// 小于等于
{{ le .num 17 }}

// 大于
{{ gt .num 17 }}

// 大于等于
{{ ge .num 17 }}

数据绑定

// todo

路由组

v2 := r.Group("/v2")
{
    v2.GET("/", func(c *gin.Context) {
    	c.String(http.StatusOK, "Ok")
    })
}

中间件

// 全局
r.Use(func...)

// 局部
r.GET("/", middleware, func)

// 后置
func (c *gin.Content) {
	c.Next()
	// todo
}