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, "%s hello world", 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
使用 go get 來下載庫
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", "./api.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("db connect error")
}
defer db.Close() //延時調用函數
db.AutoMigrate(&User{})
r := gin.Default()
r.GET("/users", index) //獲取所有用戶
r.GET("/users/:id", show) //根據id獲取用戶
r.POST("/users", store) //保存新用戶
r.PUT("/users/:id", update) //根據id更新用戶
r.DELETE("/users/:id", destroy) //根據id刪除用戶
_ = r.Run()
}
func index(c *gin.Context) {}
func show(c *gin.Context) {}
func store(c *gin.Context) {
var user User
_ = c.BindJSON(&user) //綁定一個請求主體到一個類型
db.Create(&user)
c.JSON(200, user)
}
func update(c *gin.Context) {}
func destroy(c *gin.Context) {}
postman 測試效果
獲取所有用戶接口
func index(c *gin.Context) {
var users []User
db.Find(&users)
c.JSON(200, users)
}
postman 測試效果
獲取指定id用戶接口
func show(c *gin.Context) {
id := c.Params.ByName("id")
var user User
db.First(&user, id)
if user.ID == 0 {
c.JSON(404, gin.H{"message": "user not found"})
return
}
c.JSON(200, user)
}
postman 測試效果
更新和刪除接口
func update(c *gin.Context) {
id := c.Params.ByName("id")
var user User
db.First(&user, id)
if user.ID == 0 {
c.JSON(404, gin.H{"message": "user not found"})
return
} else {
_ = c.BindJSON(&user)
db.Save(&user)
c.JSON(200, user)
}
}
func destroy(c *gin.Context) {
id := c.Params.ByName("id")
var user User
db.First(&user, id)
if user.ID == 0 {
c.JSON(404, gin.H{"message": "user not found"})
return
} else {
_ = c.BindJSON(&user)
db.Delete(&user)
c.JSON(200, gin.H{"message": "delete success"})
}
}
End
參考:https://medium.com/@cgrant/developing-a-simple-crud-api-with-go-gin-and-gorm-df87d98e6ed1