• go笔记 (编写web服务 rest api)


    记得之前有看到过说学习一门新语言比较好的方式是用新语言重写一遍用现有语言写出的功能,既然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;

    测试

      添加

      查询

      修改

      删除

  • 相关阅读:
    HDOJ 2011
    OpenCV学习笔记(1)——VS2010 下安装OpenCV 2.4.4安装
    OC——Foundation—常用的类(2)----NSArray
    OC——Foundation—常用的类(1)字符串(NSString)
    OC——Foundation—结构体
    OC----Block语法
    OC----protocol语法
    OC----初识
    OC----内存管理
    OC----Category语法
  • 原文地址:https://www.cnblogs.com/hetutu-5238/p/12916422.html
Copyright © 2020-2023  润新知