gorm/gin框架实战

13-Gin 中使用 GORM 操作 mysql 数据库 --[Gin 框架入门精讲与实战案例] GORM(Golang ORM)是Go语言(Golang)中一个非常流行的对象关系映射(ORM)库,它旨在简化数据库操作。通过GORM,开发者可以使用结构体和接口来代替SQL语句进行数据库的增删改查等操作,从而提高开发效率并减少错误。 阅读详情

gorm/gin框架实战

项目简介

学习源视频:【最新Go Web开发教程】基于gin框架和gorm的web开发实战 (七米出品)_哔哩哔哩_bilibili

本博客为我的学习笔记。

项目目标:实现一个备忘录工具(当然不支持alert),仅仅是可以记录待办事项。

实现了:添加待办项、删除待办项、完成待办项、查询待办项

项目主页展示:

image-20240603161443744

添加、查询待办项展示:

image-20240603161731924

删除待办项展示:

image-20240603163615841

项目框架

可以看看之前同专栏的博客,这是一个很基本的框架

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
	"net/http"
)

type Todo struct {
	ID     int    `json:"id"`
	Title  string `json:"title"`
	Status bool   `json:"status"`
}

var (
	DB *gorm.DB
)

func initMySQL() (err error) {
	
}

func main() {
	//连接数据库
	err := initMySQL()
	if err != nil {
		panic(err)
	}
	defer DB.Close() //关闭数据库连接
	//模型绑定
	DB.AutoMigrate(&Todo{})
	r := gin.Default()
	//设置静态资源文件
	r.Static("/static", "static")
	// 设置gin框架模版文件
	r.LoadHTMLGlob("templates/*")

	//设置路由
	r.GET("/", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index.html", nil)
	})
	//设置路由组
	v1Group := r.Group("/v1")
	{
		//添加一个事项
		v1Group.POST("/todo", func(c *gin.Context) {
			
		})
		//查看一个事项
		v1Group.GET("/todo/:id", func(c *gin.Context) {

		})
		//查看所有事项
		v1Group.GET("/todo/", func(c *gin.Context) {
			
		})
		//修改一个事项
		v1Group.PUT("/todo/:id", func(c *gin.Context) {

		})
		//删除一个事项
		v1Group.DELETE("/todo/:id", func(c *gin.Context) {

		})
	}
	r.Run()
}

接口填充

数据库连接

DB, err = gorm.Open("mysql", "usr1:12345@tcp(***:3306)/db1?charset=utf8&parseTime=True&loc=Local")
if err != nil {
    panic(err)
}
return DB.DB().Ping()

添加一个事项

v1Group.POST("/todo", func(c *gin.Context) {
    //前端页面填写待办事项,点击提交,会发送请求到这
    //1.从请求中把数据拿出来
    var todo Todo
    c.BindJSON(&todo)
    fmt.Println(todo)
    //2.存入数据库 + 3.返回响应
    if err = DB.Create(&todo).Error; err != nil {
        c.JSON(http.StatusOK, gin.H{
            "error": err.Error(),
        })
    } else {
        c.JSON(http.StatusOK, todo)
    }
})

查看所有事项

//查看一个事项
v1Group.GET("/todo/:id", func(c *gin.Context) {
    //...一般用不到
})
//查看所有事项
v1Group.GET("/todo/", func(c *gin.Context) {
    var todoList []Todo

    if err = DB.Find(&todoList).Error; err != nil {
        c.JSON(http.StatusOK, gin.H{
            "error": err.Error(),
        })
    } else {
        fmt.Println(todoList)
        c.JSON(http.StatusOK, todoList)
    }
})

修改一个事项

//修改一个事项
v1Group.PUT("/todo/:id", func(c *gin.Context) {
    id, ok := c.Params.Get("id")
    if !ok {
        c.JSON(http.StatusOK, gin.H{
            "error": "无效的id",
        })
        return
    }
    var todo Todo
    if err = DB.Where("id=?", id).First(&todo).Error; err != nil {
        c.JSON(http.StatusOK, gin.H{
            "error": err.Error(),
        })
    } else {
        c.BindJSON(&todo)
        if err = DB.Save(&todo).Error; err != nil {
            c.JSON(http.StatusOK, gin.H{
                "error": err.Error(),
            })
        } else {
            c.JSON(http.StatusOK, todo)
        }
    }
})

删除一个事项

//删除一个事项
v1Group.DELETE("/todo/:id", func(c *gin.Context) {
    id, ok := c.Params.Get("id")
    if !ok {
        c.JSON(http.StatusOK, gin.H{
            "error": "无效的id",
        })
        return
    }
    if err = DB.Where("id=?", id).Delete(Todo{}).Error; err != nil {
        c.JSON(http.StatusOK, gin.H{
            "error": err.Error(),
        })
    } else {
        c.JSON(http.StatusOK, gin.H{
            id: "delete",
        })
    }
})

ApiPost接口测试

添加接口

image-20240603165318647

image-20240603165544890

查看接口

image-20240603165337290

修改接口

image-20240603165451043

删除接口

image-20240603165524808

image-20240603165617457

企业级项目划分

1.controller

控制器:控制路由进来后执行的函数

package controller

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

/*
url -> controller -> logic -> model
请求 -> 控制器 -> 业务逻辑 -> 模型层的增删改查
*/
func IndexHandler(c *gin.Context) {
	c.HTML(http.StatusOK, "index.html", nil)
}

func Create(c *gin.Context) {
	//前端页面填写待办事项,点击提交,会发送请求到这
	//1.从请求中把数据拿出来
	var todo models.Todo
	c.BindJSON(&todo)
	fmt.Println(todo)
	//2.存入数据库 + 3.返回响应
	err := models.CreateTodo(&todo)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"error": err.Error(),
		})
	} else {
		c.JSON(http.StatusOK, todo)
	}
	//if err = DB.Create(&todo).Error; err != nil {
	//	c.JSON(http.StatusOK, gin.H{
	//		"error": err.Error(),
	//	})
	//} else {
	//	c.JSON(http.StatusOK, todo)
	//}
}

func GetTodoList(c *gin.Context) {
	todoList, err := models.GetTodoList()
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"error": err.Error(),
		})
	} else {
		fmt.Println(todoList)
		c.JSON(http.StatusOK, todoList)
	}
	//if err = DB.Find(&todoList).Error; err != nil {
	//	c.JSON(http.StatusOK, gin.H{
	//		"error": err.Error(),
	//	})
	//} else {
	//	fmt.Println(todoList)
	//	c.JSON(http.StatusOK, todoList)
	//}
}

func UpdateById(c *gin.Context) {
	id, ok := c.Params.Get("id")
	if !ok {
		c.JSON(http.StatusOK, gin.H{
			"error": "无效的id",
		})
		return
	}
	todo, err := models.GetTodoById(id)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"error": err.Error(),
		})
		return
	}
	//var todo Todo
	//if err = DB.Where("id=?", id).First(&todo).Error; err != nil {
	//	c.JSON(http.StatusOK, gin.H{
	//		"error": err.Error(),
	//	})
	//	return
	//}
	c.BindJSON(&todo)
	if err = models.UpdateTodoById(todo); err != nil {
		c.JSON(http.StatusOK, gin.H{
			"error": err.Error(),
		})
	} else {
		c.JSON(http.StatusOK, todo)
	}
}

func DeleteById(c *gin.Context) {
	id, ok := c.Params.Get("id")
	if !ok {
		c.JSON(http.StatusOK, gin.H{
			"error": "无效的id",
		})
		return
	}
	err := models.DeleteTodo(id)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"error": err.Error(),
		})
	} else {
		c.JSON(http.StatusOK, gin.H{
			id: "delete",
		})
	}
	//if err = DB.Where("id=?", id).Delete(Todo{}).Error; err != nil {
	//	c.JSON(http.StatusOK, gin.H{
	//		"error": err.Error(),
	//	})
	//} else {
	//	c.JSON(http.StatusOK, gin.H{
	//		id: "delete",
	//	})
	//}
}

2.models

模具:模型+业务逻辑(ps:可以分开)

package models

import (
	"gin_demo_BubbleList/dao"
)

type Todo struct {
	ID     int    `json:"id"`
	Title  string `json:"title"`
	Status bool   `json:"status"`
}

// Todo 增删改查
// CreateTodo 创建一个Todo
func CreateTodo(todo *Todo) (err error) {
	err = dao.DB.Create(&todo).Error
	return
}

// GetTodoList 获取全部的Todo
func GetTodoList() (todoList []*Todo, err error) {
	if err = dao.DB.Find(&todoList).Error; err != nil {
		return nil, err
	}
	return
}

// GetTodoById 通过id获取一个Todo对象
func GetTodoById(id string) (todo *Todo, err error) {
	todo = new(Todo)
	if err = dao.DB.Where("id=?", id).First(&todo).Error; err != nil {
		return nil, err
	}
	return
}

// UpdateTodoById 更新一个Todo对象
func UpdateTodoById(todo *Todo) (err error) {
	err = dao.DB.Save(todo).Error
	return
}

// DeleteTodo
func DeleteTodo(id string) (err error) {
	err = dao.DB.Where("id=?", id).Delete(&Todo{}).Error
	return
}

3.dao

dao:存放关于数据库的相关操作

package dao

import "github.com/jinzhu/gorm"

var (
	DB *gorm.DB
)

func InitMySQL() (err error) {
	DB, err = gorm.Open("mysql", "usr1:12345@tcp(***:3306)/db1?charset=utf8&parseTime=True&loc=Local")
	if err != nil {
		panic(err)
	}
	return DB.DB().Ping()
}

4.router

router:一般用于设置路由

package router

import (
	"gin_demo_BubbleList/controller"
	"github.com/gin-gonic/gin"
)

func SetRouter() *gin.Engine {
	r := gin.Default()
	//设置静态资源文件
	r.Static("/static", "static")
	// 设置gin框架模版文件
	r.LoadHTMLGlob("templates/*")

	//设置路由
	r.GET("/", controller.IndexHandler)
	//设置路由组
	v1Group := r.Group("/v1")
	{
		//添加一个事项
		v1Group.POST("/todo", controller.Create)
		//查看所有事项
		v1Group.GET("/todo/", controller.GetTodoList)
		//修改一个事项
		v1Group.PUT("/todo/:id", controller.UpdateById)
		//删除一个事项
		v1Group.DELETE("/todo/:id", controller.DeleteById)
	}
	return r
}

4.整体架构

image-20240603175629138

我的源码:6月/gin_demo_BubbleList · 沉着冷静/2023 - 码云 - 开源中国 (gitee.com)

【go从零单排】gin+gorm理解及实现CRUD 是一个流行的 Go 语言 ORM(对象关系映射)库,它提供了一个简单且强大的方式来与数据库进行交互。它允许开发者使用 Go 语言的结构体来表示数据库表,并通过方法调用来执行 CRUD(创建、读取、更新、删除)操作。Gin 是一个高性能的 Go 语言 Web 框架,专为构建 RESTful API 和 Web 应用而设计。它以简洁的 API 和高效的性能著称,适合用于构建快速、可扩展的 Web 服务。Gin 基于 net/http 包构建,提供了许多功能,如中间件支持、路由分组、JSON 验证、错误处理等。 阅读详情

相关推荐

1.golang : gorm + gin实现restful 接口

golang : gorm + gin实现restful 接口 gorm操作数据库 golang可以使用gorm工具对数据库进行操作,实现对数据的一系列操作. gorm的中文文档如下: https://jasperxu.github.io/gorm-zh/ 主要实现的功能如下: 全功能ORM(几乎) 关联(包含一个,包含多个,属于,多对多,多种包含) Callbacks(创建/...

linux_player_c(系统&开发) 7275

【GoLang】《GORM实战》第一篇:初识GORM框架

文章目录概述特性安装连接到数据库数据库配置自定义驱动现有的数据库连接连接池快速入门模型gorm.Model模型定义嵌入结构体字段级权限控制时间追踪结构体标签字段标签关联标签示例约定主键表名列名时间戳跟踪CreatedAtUpdatedAtDeletedAtGorm方法分类链式方法Finisher Method新建会话模式 概述 The fantastic ORM library for Golang aims to be developer friendly. 一个致力于开发者友好、极好的Golang OR

浩瀚宇宙的一粒尘埃 4692

《100天Go语言从入门到精通系列》-专栏介绍和目录

本专栏专注于Go语言基础到进阶,从项目实战到源码分析的系统讲解,逐步深入实际应用场景到Go语言的高级特性,轻松学会用Go语言解决各种实际问题。不管是零基础还是有经验的开发,相信都能从本专栏获益。持续更新中...

数据知道的博客 7009

Gorm连接以及CURD实战+测试

Gorm是go的一个ORM框架,官方文档地址为->本文将介绍与gorm有关的CRUD操作,操作数据库类型为mysql数据库。

cczj0的博客 1449

Go语言云原生实战150篇完整学习路径:从入门到精通Go后端开发

160篇文章从Go的第一个到分布式系统的架构设计,覆盖了Go后端开发的完整知识体系。学习路径的核心原则是: 先学语法再学并发,先写Web再搞微服务,先跑项目再看源码。最大的经验是: 不要跳过基础。我见过太多人goroutine都写不好就去学K8s Operator,结果生产环境一个数据竞争排查三天。把基础打扎实,后面的进阶是水到渠成的事。Go的哲学是简单,但简单不代表容易。160篇的内容量不小,按自己的节奏学,每篇的代码都动手跑一遍,踩坑经验记下来,3个月后你会发现Go后端开发真的不难。

白话机器学习 322

由gin + gorm + jwt + casbin组合实现的RBAC权限管理脚手架Golang-gin-web.zip

由gin + gorm + jwt + casbin组合实现的RBAC权限管理脚手架Golang-gin-web

Go GORM实战(一) | 简单的增删改查

GORM是一个非常优秀的Golang数据库ORM库,支持MySQL, PostgreSQL, SQlite, SQL Server等数据库。

qq_39335595的博客 1107

从Pikachu靶场实战解析越权漏洞:原理、攻击与防御

本文通过Pikachu靶场实战详细解析越权漏洞的原理、攻击方式与防御策略。文章深入探讨水平越权和垂直越权的危害,结合代码示例展示漏洞利用过程,并提供代码层和架构层的立体化防御方案,帮助开发者有效防范这一Web安全隐形杀手。

weixin_29325007的博客 356

go从0到1项目实战体系四十七:gorm实战

db.DB()可以返回原生的sql.db这个对象。

wanmeijuhao的博客 353

内网CentOS离线部署LibreOffice:从依赖缺失到服务启动的完整避坑指南

本文详细介绍了在CentOS内网环境中离线部署LibreOffice的完整流程,包括依赖包准备、安装顺序优化及常见报错解决方案。针对金融等封闭网络场景,提供从rpm包选择到服务启动的全套避坑指南,特别解决libXinerama等图形库缺失问题,确保文档转换服务稳定运行。

weixin_33416697的博客 246

JS+H5打字练习器

实现功能 1.导入.TXT文件到打字练习内容(部分浏览器可能出于安全问题限制了这一步操作) 2.输入文本到打字练习内(弹出输入框,将要练习的内容输入至输入框) 3. 开始练习,并根据正误在打字练习内容文本上修改颜色(某个字正确显示绿色,某个字错误,显示红色,某个字没有打显示灰色) 4.开始练习、结束练习,全部输入完成后自动结束练习,也可提前手动结束练习,结束练习后弹窗用显示时和正确率。(区别在于一个全部输入完成且全部正确,一个提前结束无其他条件) 效果图 分析 HTML 结构解析 根元素:<!DO

w11111xxxl的博客 1413

Gin+Gorm快速构建问答社区后端实战指南

Web开发框架与ORM工具是现代后端开发的核心组件,Gin作为Go语言的高性能Web框架,配合Gorm提供的优雅ORM解决方案,能显著提升开发效率。在RESTful API开发场景中,这种组合特别适合快速构建用户管理、内容发布等模块,实测显示相比传统Java技术栈有300%以上的效率提升。通过中间件机制实现JWT鉴权仅需20行代码,配合Gorm的链式调用可以像说话一样操作数据库。在问答社区、知识管理系统等需要快速验证产品原型的场景中,Gin+Gorm的组合能帮助开发者在8小时内完成从零到生产环境的完整后端搭

cuiji1279的博客 358

【即插即用模块】注意力篇 | ECCV 2024 | DPB:高低频动态分离+双提示融合,PSNR直冲40+!

本文提出了一种基于频率提示的图像恢复方法FPro,通过动态滤波器分离输入特征的高低频分量,并采用双提示块(DPB)进行频域专属提示生成与调制。DPB包含低频提示调制器(LPM)和高频提示调制器(HPM),分别处理不同频段信号,通过生成提示组件并融合解码器特征来优化恢复效果。实验表明,该方法在U型结构中表现优异,尤其适用于分割、底层视觉和多模态任务。模块通过动态无监督频率分离、频域专属提示生成和适配性融合机制,有效解决了传统方法对频域信息关注不足的问题,显著提升了图像恢复质量。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 147

Golang日志管理:使用log实现高级功能和性能优化

在现代软件开发中,日志记录是一个不可或缺的部分,它帮助开发者追踪应用行为、调试问题并保持系统的健康。Golang,作为一种高效的编程语言,提供了多种日志记录工具,而log/slog库则是其中功能强大且灵活的选择之一。log/slog是一个标准的日志库,旨在提供一个简单、模块化且高效的日志解决方案。它支持不同级别的日志记录,如信息、警告和错误等,使得开发者可以根据不同的信息重要性进行适当的记录。此外,slog的设计允许通过插件扩展其功能,如添加日志处理器、格式化器或是输出目标,从而满足更加复杂的日志管理需求。

walkskyer的博客 2416

容器化部署指南——Docker/K8s环境下的OpenClaw实践(附Dockerfile)

通过本文的详细指导,你已经掌握了OpenClaw在Docker和Kubernetes环境中的容器化部署方法。从基础镜像构建到高级部署策略,从开发环境到生产环境,你现在已经具备了完整的容器化部署能力。 容器化技术为OpenClaw提供了灵活、可扩展、可移植的部署方案,能够满足不同规模和需求的应用场景。通过合理使用Docker和Kubernetes,你可以实现高效的部署管理和运维自动化。 在实际应用中,建议根据具体的业务需求选择合适的部署策略,并结合监控、日志、安全等最佳实践,确保系统的稳定性和可靠性。同时

博客 493

Windows配置L2TP/IPsec连接

Windows 系统的 L2TP/IPsec 功能,通过配置即可构建加密 VPN 通道。

m0_61806534的博客 1666

整理了一套 Go 系统教程:131 篇从语法到 K8s Operator,附完整学习路径

一份覆盖 Go 基础、Gin、GORM、gRPC、微服务、go-zero、Docker、K8s Operator、并发、性能调优、设计模式、数据结构与算法的系统教程,131+ 篇,5 大学习路径,适合从入门到资深的 Go 工程师

Awna的博客 251

华为OD机试真题 新系统 2026-07-22 Java&Go&C 实现【最小代价完成论文评审】

某校有 n 篇论文需要分配给教师评审。 每篇论文 i 可由 files[i] 对应的教师列表中任一教师评审。 每篇论文至少需要一名教师评审。 每位教师 t 不论被分配多少篇论文,其评审费用固定为 cost[t]。 请给出参与评审教师数量最少时的总费用。 如果存在多种方案满足教师数量最少,则选择总费用最小的方案。

MISAYAONE的博客 148

Go结构体标签(Tag)解析

摘要 本文深入解析Go语言结构体标签(Struct Tag)的使用,涵盖JSON序列化、数据库映射和Gin框架应用等场景。文章首先通过常见问题引入结构体标签的必要性,然后详细讲解标签的基础语法规则和常用类型。重点剖析了JSON标签的各种用法和选项,包括字段映射、空值忽略和类型转换等特性。同时介绍了数据库操作中sqlx和Gorm框架的标签使用方式,以及Gin框架中的参数绑定标签。通过大量代码示例展示了结构体标签在实际开发中的强大功能,帮助开发者掌握这一重要特性,提升Go语言开发效率。

2301_78841354的博客 753

开源项目-智能算法中台管理系统

智能算法中台管理系统,系统主要有样本中心,算法中心,模型中心等模块

u010479989的博客 2997

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Gin框架结合gorm使用

Gin框架结合Gorm使用 目录 Gin框架结合Gorm使用 前言 一、介绍 二、使用步骤 1.创建项目 2.开始main.go 3.router的初始化 4.controller的初始化 5.services的初始化 6.models的初始化 7.my.init的初始化 8.开始测试 总结 前言 笔者为golang语言的初学者,之前一直是使用beego框架和框架中自带的orm,使用这一套框架做项目也有大半年了,总的来说对于初学者来讲入门也是可以的。在使用了一段时间当...

qq_42057890的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

基于gin框架和gorm的web开发实战

学习框架——Gin、GORM框架——搭建好的一个舞台,不需要重复造轮子我们在舞台上表演,只需要关注表演的内容,不需要关注舞台怎么搭建的Gin 是一个用 Go (Golang) 编写的 Web 框架。它具有类似 martini 的 API,性能要好得多,多亏了httprouter,速度提高了 40 倍。如果您需要性能和良好的生产力,您一定会喜欢 Gin。在本节中,我们将介绍 Gin 是什么,它解决了哪些问题,以及它如何帮助你的项目。"Gin 是一个用 Go (Golang) 编写的 Web 框架。

2301_79819426的博客 1579

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Go语言Gin框架+Gorm实战CRUD

Gin 和 Gorm 是 Go 编程语言中流行的开源库。但是,它们服务于不同的目的,通常在 web 开发项目中一起使用。 Gin 是一个用于构建 HTTP 服务器的 web 框架。它提供了一个简单易用的 API,用于处理 HTTP 请求和响应、路由、中间件和其他常见的 web 应用程序所需的功能。它以其高性能和简约为特点,提供了轻量级和灵活的解决方案来构建 web 服务器。 Gorm 是 Go 的一个 ORM(对象关系映射)库。

ecloud_developer的博客 2681

Golang gin框架

gin框架学习一、Gin 介绍二、Gin 环境搭建三、golang 程序的热加载四、Gin 框架中的路由五、Gin HTML 模板渲染六、静态文件服务七、路由详解八、Gin 中自定义控制器九、Gin 中间件十、Gin 中自定义Model十一、Gin 文件上传十二、Gin 中的Cookie十三、Gin 中的Session十四、Gin 中使用GORM 操作mysql 数据库十五、原生 SQL 和 SQL 生成器十六、Gin 中使用GORM 实现表关联查询十七、 GORM 中使用事务十八、Gin 中使用go

book_longker的专栏 2万+

Gin之GORM 操作数据库(MySQL)

GORM 是 Golang 的一个 orm 框架。简单说,ORM 就是通过实例对象的语法,完成关系型数据库的操作的技术,是"对象-关系映射"(Object/Relational Mapping) 的缩写。使用 ORM框架可以让我们更方便的操作数据库。

阿澈不吃蒜的博客 3189

gin与gorm框架知识点总结

通过c.Next()执行后续处理,c.Abort()终止请求流程go// 自定义日志中间件// 请求前执行:记录请求时间// 执行后续路由处理(控制器函数)c.Next()// 请求后执行:记录响应耗时Model 是 GORM 与数据库表的映射结构体,通过tag配置表名、字段名、类型、约束等。goimport ("time"// User 对应数据库表 users(默认蛇形命名)

2401_88948820的博客 993
上一篇: Gin入门
下一篇: Redis对象
沉着冷静2024
博客等级 码龄5年 669粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值