go 是一门非常灵活的语言,既具有静态语言的高性能,又有动态语言的开发速度快的优点,语法也比较简单,本例就通过简单的代码实现了一个简单的增删改查 api 接口
hello world
常规版
新建 demo1.go
并输入以下代码,进入命令行,go run demo1.go
,就可以看到命令行输出 hello world
package main
import \"fmt\"
func main() {
fmt.Println(\"hello word\")
}
网络版
使用 go
标准库 http
可以很容易建立一个 http 服务,保存以下代码为 demo2.go
package main
import (
\"fmt\"
\"net/http\"
)
func main() {
http.HandleFunc(\"/\", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, \"hello world, %s\", r.Method)
})
http.ListenAndServe(\":8080\", nil)
}
使用 go run
命令,打开浏览器 http://127.0.0.1:8080/
查看效果。
通过观察上面,发现 go 程序代码的结构为:包申明->导入包->函数。其中 main 包说明该程序是一个独立的程序,main 函数是入口函数
gin
gin
是一个基于 http
库的轻量级 go 框架,只要几行代码就可以起一个 api 服务,使用前需要下载这个库,
demo
$ go get github.com/gin-gonic/gin
package main
import \"github.com/gin-gonic/gin\"
func main() {
r := gin.Default() // 返回一个默认的gin实例
r.GET(\"/ping\", func(c *gin.Context) {
c.JSON(200, gin.H{
\"message\": \"pong\",
})
})
r.Run() // 默认在 0.0.0.0:8080 上监听并服务
}
保存上面代码在 api.go
中,运行 go run api.go
,浏览器或 postman 打开 http://127.0.0.1:8080/ping
查看效果
gorm
gorm 是一个类似于 laravel 中的 Eloquent ORM,支持mysql,sqlite等多种数据库,使用前请下载
$ go get github.com/jinzhu/gorm
$ go get github.com/mattn/go-sqlite3 //sqlite驱动
curd api
利用以上包,编写一个对用户资料实现增删改查的接口
新增用户接口
package main
import (
\"github.com/gin-gonic/gin\"
\"github.com/jinzhu/gorm\"
_ \"github.com/jinzhu/gorm/dialects/sqlite\"
\"log\"
)
var db *gorm.DB
var err error
type User struct {
ID uint `json:\"id\"`
Name string `json:\"name\"`
Email string `json:\"email\"`
}
func main() {
db, err = gorm.Open(\"sqlite3\", \"./demo.db\")
//使用mysql
//gorm.Open(“mysql”, “user:pwd@tcp(127.0.0.1:3306)/dbname?charset=utf8&parseTime=True&loc=Local”)
if err != nil {
log.Fatal(\"数据库连接失败\")
}
defer db.Close() //延时调用函数
db.AutoMigrate(User{})
r := gin.Default()
r.GET(\"/users\", GetUsers) //获取所有用户
r.GET(\"/users/:id\", GetUser) //根据id获取用户
r.POST(\"/users\", StoreUsers) //保存新用户
r.PUT(\"/users/:id\", UpdateUser) //根据id更新用户
r.DELETE(\"/users/:id\", DeleteUser) //根据id删除用户
r.Run()
}
func GetUsers(c *gin.Context) {}
func GetUser(c *gin.Context) {}
func StoreUsers(c *gin.Context) {
var user User
c.BindJSON(&user) //绑定一个请求主体到一个类型
db.Create(&user)
c.JSON(200, user)
}
func UpdateUser(c *gin.Context) {}
func DeleteUser(c *gin.Context) {}
使用 postman 测试
获取所有用户接口
func GetUsers(c *gin.Context) {
var users []User
if err = db.Find(&users).Error; err != nil {
c.AbortWithStatusJSON(500, err)
} else {
c.JSON(200, users)
}
}
postman 测试效果
获取指定id用户接口
func GetUser(c *gin.Context) {
id := c.Params.ByName(\"id\")
var user User
if err := db.Where(\"id = ?\", id).First(&user).Error; err != nil {
c.AbortWithStatusJSON(500, err)
} else {
c.JSON(200, user)
}
}
用 postman 请求 http://127.0.0.1:8080/users/2
如图
更新和删除接口
func UpdateUser(c *gin.Context) {
var user User
id := c.Params.ByName(\"id\")
if err := db.Where(\"id = ?\", id).First(&user).Error; err != nil {
c.AbortWithStatusJSON(500, err)
}
if user.ID > 0 {
c.BindJSON(&user)
db.Save(&user)
c.JSON(200, user)
}
}
func DeleteUser(c *gin.Context) {
id := c.Params.ByName(\"id\")
var user User
db.Where(\"id = ?\", id).Delete(&user)
c.JSON(200, gin.H{\"id #\" + id: \"deleted\"})
}
End
参考:https://medium.com/@cgrant/developing-a-simple-crud-api-with-go-gin-and-gorm-df87d98e6ed1