记得之前有看到过说学习一门新语言比较好的方式是用新语言重写一遍用现有语言写出的功能,既然web项目做的比较多所以就先写下web api
先创建项目,
并添加部分框架依赖,即go.mod内容 。 gin主要用来做路由分发控制,gorm主要做orm映射
module web_application go 1.14 require ( github.com/gin-gonic/gin v1.6.3 github.com/jinzhu/gorm v1.9.12 github.com/satori/go.uuid v1.2.0 )
程序文件不多 一共只有三个。db_init.go主要是数据库连接初始化
1 package database 2 3 import ( 4 "github.com/jinzhu/gorm" 5 _ "github.com/jinzhu/gorm/dialects/mysql" 6 "log" 7 ) 8 9 var Mysql_db *gorm.DB 10 11 func init() { 12 db,err :=gorm.Open("mysql", "root:123456@(localhost:3306)/users?charset=utf8&parseTime=True&loc=Local") 13 if err != nil { 14 log.Fatal(err) 15 return 16 } 17 log.Print("数据库加载成功=========================================") 18 db.LogMode(true) 19 Mysql_db = db 20 }
main.go主要包含启动程序和路由分发。
1 package main 2 3 import ( 4 "github.com/gin-gonic/gin" 5 "web_application/controller/animal" 6 ) 7 8 func main() { 9 10 ctx :=gin.Default() 11 ctx.POST("/animal",animal.Add) 12 ctx.GET("/list",animal.List) 13 ctx.DELETE("/:id",animal.Delete) 14 ctx.PUT("/update",animal.Update) 15 ctx.Run(":8080") 16 }
user_controller.go则主要包含增删改查的接口和结构体
package animal import ( "encoding/json" "fmt" "github.com/gin-gonic/gin" "github.com/jinzhu/gorm" "github.com/satori/go.uuid" "hash/crc32" "log" "strconv" "web_application/database" ) type animal struct { Id uint `gorm:"primary_key" json:"id"` Username string `json:"username"` Password string `json:"password"` Name string `json:"name"` } /** 添加用户 */ func Add(ctx *gin.Context) { var am1 animal if err :=ctx.BindJSON(&am1);err != nil { log.Print(err) ctx.JSON(500,gin.H{ "msg":"添加失败", }) return } aj,_:= json.Marshal(am1) fmt.Printf("添加用户: %s ",string(aj)) am1.Id = genUUID() database.Mysql_db.Transaction(func(tx *gorm.DB) error { if err :=tx.Create(&am1).Error;err != nil{ log.Print("错误 事物回滚",err) ctx.JSON(500,gin.H{ "msg":err, }) return err } log.Print("已成功添加用户 ") ctx.JSON(200,gin.H{ "msg":"成功添加", }) return nil }); } func List(ctx *gin.Context) { username :=ctx.Query("username") name :=ctx.Query("name") var ams []animal if err := database.Mysql_db.Where("username like ? and name like ?","%"+username+"%","%"+name+"%" ).Find(&ams).Error;err == nil { if len(ams) > 0 { aj,_ := json.Marshal(ams) log.Printf("获取到用户数据:%s ",string(aj) ) } ctx.JSON(200,gin.H{ "msg":ams, }) }else { log.Print("查询错误",err) ctx.JSON(500,gin.H{ "msg":err, }) return } } /** 删除方法 */ func Delete(ctx *gin.Context) { id :=ctx.Param("id") inId ,_:=strconv.Atoi(id) a1 := animal{Id:uint(inId)} database.Mysql_db.Transaction(func(tx *gorm.DB) error { if err :=tx.Delete(&a1).Error ;err != nil{ log.Print("错误 事物回滚 ") ctx.JSON(500,gin.H{ "msg":err, }) return err } log.Printf("已成功添加用户:%s ",id) ctx.JSON(200,gin.H{ "msg":"成功删除", }) return nil }) } func Update(ctx *gin.Context) { var am1 animal if err :=ctx.BindJSON(&am1);err != nil { log.Print(err) ctx.JSON(500,gin.H{ "msg":"修改错误", }) return } database.Mysql_db.Transaction(func(tx *gorm.DB) error { if err :=tx.Save(&am1).Error;err != nil{ log.Print("错误 事物回滚 ") ctx.JSON(500,gin.H{ "msg":"修改错误", }) return err } log.Print("已成功修改用户 ") ctx.JSON(200,gin.H{ "msg":"修改成功", }) return nil }); } func genUUID() uint{ id :=uuid.NewV4() uuidHash := uint(crc32.ChecksumIEEE([]byte(id.String()))) return uuidHash }
当然也可以写自定义sql操作,例如自定义查询结果可以如下操作
定义结构体
type animalDTO struct { Ids uint Usernames string Passwords string Names string }
自定义查询
var amss []animalDTO database.Mysql_db.Raw("select id as ids,username as usernames,password as passwords ,name as names from animals where name like ?","%孙%",amss).Scan(&amss) log.Print("获取到了结果",amss)
最后创建表即可
CREATE TABLE `animals` ( `id` bigint NOT NULL, `username` varchar(255) DEFAULT NULL, `password` varchar(255) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;