# Gin

# 介绍

Gin 是一个用 Go 语言 (Golang) 编写的 HTTP web 框架。它具有类似 Martini 的 API,但性能比 Martini 快 40 倍。如果你需要极好的性能,使用 Gin 吧。

Gin 的官方文档:文档

# 获取

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

# 使用样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main

import (
"fmt"
//导入gin包
"github.com/gin-gonic/gin"
"net/http"
)

func main(){
//创建一个http服务
r := gin.Default()
//创建一个GET请求的响应
r.GET("/", func(c *gin.Context){
c.JSON(http.StatusOK, gin.H{"msg":"Hello World!"})
})
//运行http服务
_ = r.Run()
}

使用 go run 或者 go build 运行,打开地址 localhost:8080 即可

# 常用函数介绍 (快速入门)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
func Default()(*Engine)

//创建一个路由组,其路径为path,可在后面添加中间件函数,返回该路由组
func (group *RouterGroup) Group(path string, handlers ...HandlerFunc) *RouterGroup
//配置静态文件路径
func (group *RouterGroup) Static(relativePath string, root string) IRoutes
//载入html文件
//载入pattern路径下的所有html文件,示例:r.LoadHTMLGlob("templates/*"),其中*为通配符
func (engine *Engine) LoadHTMLGlob(pattern string)
//载入指定file,可以填入多个
func (engine *Engine) LoadHTMLFiles(files ...string)

//创建一个GET响应,响应函数为handlers(自己写)
func (group *RouterGroup) GET(path string, handlers ...HandlerFunc) IRoutes
//创建一个POST响应
func (group *RouterGroup) POST(path string, handlers ...HandlerFunc) IRoutes
//创建一个PUT响应
func (group *RouterGroup) PUT(path string, handlers ...HandlerFunc) IRoutes
//创建一个DELETE响应
func (group *RouterGroup) DELETE(path string, handlers ...HandlerFunc) IRoutes
//创建一个NoRoute响应,当没有匹配的请求目录时,进入该响应,通常用于404
func (engine *Engine) NoRoute(handlers ...HandlerFunc)

//返回一个HTML
func (c *Context) HTML(code int, name string, obj any)
//返回JSON数据
func (c *Context) JSON(code int, obj any)

//获取数据,并与any中的成员自动匹配写入,需要传入一个指针以便于修改
func (c *Context) BindJSON(obj any) error

//通过url获取数据,比如/index/18,设置路由路径为"/index/:id",则可以使用c.Params("id")
//以string的形式返回获取到的数据
func (c *Context) Param(key string) string
//同上,但还会返回一个bool值用来标记是否获取到数据
func (ps Params) Get(name string) (string, bool)

//通过url获取数据,比如/index?search=如何学习gin框架&usrname=张三
//则可以使用search := c.Query("search")
func (c *Context) Query(key string) (value string)

//用于获取前端表单提交,使用key进行匹配
func (c *Context) PostForm(key string) (value string)

//运行服务,默认监听本地端口8080,可以输入addr指定监听
func (engine *Engine) Run(addr ...string) (err error)

# 响应样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package main

import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
)

func main(){
r := gin.Default()
//POST响应:
r.POST("/", func(c *gin.Context){
c.JSON(http.StatusOK, gin.H{"msg":"增"})
})
//GET响应:
r.GET("/", func(c *gin.Context){
c.JSON(http.StatusOK, gin.H{"msg":"查"})
})
//PUT响应:
r.PUT("/", func(c *gin.Context){
c.JSON(http.StatusOK, gin.H{"msg":"改"})
})
//DELETE响应:
r.DELETE("/", func(c *gin.Context){
c.JSON(http.StatusOK, gin.H{"msg":"删"})
})
_ = r.Run()
}

# Gorm

# 介绍

Golang 出色的 ORM 库,旨在对开发人员友好

gorm 是国人开发的一个 ORM 库,想学的话读文档更好一些,官方文档

# 获取

1
go get -u github.com/jinzhu/gorm

# 使用样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package main

import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql" //导入mysql驱动,根据自己需要自行导入
)

// User Models
type User struct {
//嵌套gorm内置的Model结构体
//该结构体包含ID(默认主键),创建时间,修改时间,删除时间四个字段
gorm.Model
//使用Tag给gorm建表添加参数,参数之间使用分号分隔
Name string `gorm:"default:'匿名用户';type:varchar(20)"`
Age int32
}

func main() {
//填写数据库信息
usrAndPwd := "username:password"
host := "@(127.0.0.1:3306)"
otherArgs := "/database01?charset=utf8mb4&parseTime=True&loc=Local"

//使用Open连接数据库,返回数据库db和错误信息err
db, err := gorm.Open("mysql", usrAndPwd + host + otherArgs)
if err != nil {
//处理错误信息
fmt.Println("database connect failed, err:", err)
return
}
//使用defer关闭数据库
defer db.Close()

//将User模型进行绑定
db.AutoMigrate(&User{})

//添加行,如果不存在表users则会自动创建users
db.Create(&User{ //传递指针节省空间
//不填写Name,使用默认的"匿名用户"
Age: 18,
})
}

# 常用函数介绍 (快速入门)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//创建一个数据库连接,dialect为数据库类型,args为数据库参数,例如:
//Open("mysql", args),args包括连接数据库用户名,密码,地址等,详细可见使用样例
func Open(dialect string, args ...interface{}) (db *DB, err error)
//关闭数据库连接
func (s *DB) Close() error

//在任意方法前添加Debug(),即可在命令行输出该语句所生产的SQL语句
//使用示例:db.Debug().Where("id=?", id).Find(&user)
func (s *DB) Debug() *DB

//自动匹配字段,绑定模型,传入一个模型的地址即可
func (s *DB) AutoMigrate(values ...interface{}) *DB

//CRUD
//根据传入的value创建一条记录,通常传入一个model的实例,可以传递指针来节省空间
func (s *DB) Create(value interface{}) *DB

// 获取第一条记录(主键升序),通常传入一个model实例的指针,以便于函数内部修改其内容
func (s *DB) First(out interface{}, where ...interface{}) *DB
// 获取一条记录,没有指定排序字段
func (s *DB) Take(out interface{}, where ...interface{}) *DB
// 获取最后一条记录(主键降序)
func (s *DB) Last(out interface{}, where ...interface{}) *DB

//Save会更新所有字段的值,即使字段是零值
func (s *DB) Save(value interface{}) *DB
//更新单字段,可以使用where进行行限定,传入更新参数以key,value形式
func (s *DB) Update(attrs ...interface{}) *DB
//更新多字段,可以使用where进行行限定,传入struct或者map[string]interface{}
//其中map[string]interface{}为key(string),value(interface{})
func (s *DB) Updates(values interface{}, ignoreProtectedAttrs ...bool) *DB

//删除记录,gorm默认为软删除,即并不进行物理上的删除,而是为记录添加删除时间
//当删除时间不为空,则查询时无视该记录,gorm.Model包含了删除时间字段
//如果使用自建Model,并且没有删除时间字段,则为物理删除
func (s *DB) Delete(value interface{}, where ...interface{}) *DB

//高级查询

//使用给出的query语句进行查询,需要注意,Select并不是一个立即执行方法,所以通常配合Find使用
//使用示例:db.Select("name, age").Where("id=?", id).Find(&user)
//SELECT name, age FROM `users` WHERE `users`.`deleted_at` IS NULL AND ((id=1))
func (s *DB) Select(query interface{}, args ...interface{}) *DB

//对给其的value(model的示例)进行操作,通常搭配Update进行修改
//使用示例:db.Model(&user).Update("name", "hello")
//则会自动根据user的id查询到其记录,然后把name改为hello,假设其id为111,则SQL语句为:
//UPDATE users SET name='hello', updated_at='current time' WHERE id=111;
//如果仅传入Model,则对应整张表
func (s *DB) Model(value interface{}) *DB

//Where可以搭配查找(Find)或者修改(Update)使用,例如:
//使用示例:db.Where("id=?", id).Find(&user)
//使用示例2:db.Model(&User{}).Where("id=?", id).Update("name", "hello")
func (s *DB) Where(query interface{}, args ...interface{}) *DB

# 立即执行方法

立即执行方法是指那些会立即生成 SQL 语句并发送到数据库的方法,他们一般是 CRUD 方法,比如:

Create,First,Find,Take,Save,Update,Delete,Scan,Row,Rows…

# 对应关系

Gorm 中存在如下的对应关系:

Model table
object row
filed filed

模型对应整表,实例对应记录,字段对应字段