Gin框架从入门到实战:核心用法与最佳实践
为什么选择Gin框架?
Gin 是一个基于 Go 语言的高性能 Web 框架,具备以下优势:
- 轻量高效:底层依赖 net/http,性能接近原生。
- 简洁优雅:API 设计友好,支持路由分组、中间件链、参数绑定等特性。
- 生态丰富:内置 JSON 解析、日志记录、错误恢复等实用功能,社区插件生态完善。
- 无论是构建 RESTful API 还是全栈应用,Gin 都能显著提升开发效率。
安装
要安装Gin软件包,您需要安装Go并首先设置Go工作区。
- 首先需要安装Go(需要1.10+版本),然后可以使用下面的Go命令安装Gin。
go get -u github.com/gin-gonic/gin
- 将其导入您的代码中:
import "github.com/gin-gonic/gin"
基础示例
package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {// 1.创建 (实例化gin.Engine结构体对象)r := gin.Default()// 2.绑定路由规则,执行的函数// gin.Context,封装了request和responser.GET("/", func(c *gin.Context) {c.String(http.StatusOK, "Hello, Gin!")})// 3.监听端口,默认在8080// Run("里面不指定端口号默认为8080")r.Run(":8080")
}
运行后访问 http://localhost:8080,即可看到返回的字符串。
Gin工工作作流流程
核心概念
- Engine 容器对象,整个框架的基础
- Engine.tree 负责存储路由和handle方法的映射,采用类似于字典树的结构
- Engine.RouterGroup 其中handlers存储着所有中间件
- Context 上下文对象,负责处理 请求回应 ,其中handles的存储处理请求时中间件和处理方法的
请求处理 流程
GIN启动流程
Gin初始化----> Use 中间件 ----> 注册Routers路由 ----> RUN()启动
Gin原原理解析
参考资料:http://v5blog.cn/pages/dd7d5a/
gin.Default()
Default()跟New()几乎一模一样, 就是调用了gin内置的Logger(), Recovery()中间件
// Default返回一个已经附加了Logger和Recovery中间件的Engine实例
func Default() *Engine {debugPrintWARNINGDefault()engine := New() "# 默认实例// 注册中间建,中间件的是一个函数,最终只要返回一个 type HandlerFunc func(*Context) 就可以engine.Use(Logger(), Recovery()) // 默认注册的两个中间件return engine
}
engine := New() 初初始化始化
通过调用 gin.New() 方法来实例化 Engine容器
engine.Use() 注注册册中间件 中间件
路由与参数处理
无参路由
func HelloWorldhandler(ctx *gin.Context){ctx.JSON(200, gin.H{"message": "Hello World",})
}func main() {// 创建一个默认的路由器router := gin.Default()// gin.Context是一个结构体,包含了请求和响应的细节, 封装request和responserouter.GET("/",HelloWorldhandler)// 路由重定向router.GET("/re", func(c *gin.Context) {c.Redirect(http.StatusMovedPermanently, "https://www.baidu.com")})// 启动服务器router.Run(":8081")
}
动态路由参数
通过 :param 捕获 URL 中的变量:
(可以通过Context的Param方法来获取API参数)
r.GET("/book/:id", func(c *gin.Context) {bookID := c.Param("id")c.String(http.StatusOK, "书籍ID: %s", bookID)
})
查询参数
使用 Query 或 DefaultQuery 获取 URL 参数:
http://127.0.0.1:8000/user?name=zhangsan
r.GET("/user", func(c *gin.Context) {name := c.Query("name")role := c.DefaultQuery("role", "guest")c.JSON(200, gin.H{"name": name, "role": role})
})
ShouldBind参数绑定
通过 ShouldBind 自动解析请求体(支持 JSON、Form 等):
我们可以基于请求的 Content-Type 识别请求数据类型并利用反射机制
自动提取请求中 QueryString 、 form表单 、 JSON 、 XML 等参数到结构体中
type LoginForm struct {Username string `form:"username" binding:"required"`Password string `form:"password" binding:"required"`
}r.POST("/login", func(c *gin.Context) {var form LoginFormif err := c.ShouldBind(&form); err != nil {c.JSON(400, gin.H{"error": err.Error()})return}c.String(200, "登录成功: %s", form.Username)
})
完整代码案例
package mainimport ("fmt""github.com/gin-gonic/gin""net/http"
)// HelloWorldhandler 无参数路由处理函数
func HelloWorldhandler(ctx *gin.Context){ctx.JSON(200, gin.H{"message": "Hello World",})
}func GetBookDetailHandler(ctx *gin.Context ) {bookId := ctx.Param("id")ctx.String(http.StatusOK, fmt.Sprintf("成功获取书籍详情:%s", bookId))}func GetUserDetailHandlers(ctx *gin.Context) {username := ctx.Query("username")ctx.String(http.StatusOK, fmt.Sprintf("成功获取用户详情:%s", username))
}type Login struct {Username string `form:"username" json:"username" binding:"required"`Password string `form:"password" json:"password" binding:"required"`
}func ResponseJsonHandler(c *gin.Context) {type Data struct {Msg string `json:"msg:"`Code int `json:"code"`}d := Data{Msg: "success",Code: 200,}c.JSON(http.StatusOK, d)
}
func Loginhandler(c *gin.Context) {var login Loginif err := c.ShouldBind(&login); err == nil {c.JSON(http.StatusOK, gin.H{"username": login.Username,"password": login.Password,})} else {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})}
}func ResponseStringHandle(c *gin.Context) {c.String(http.StatusOK, "Hello World")
}func main() {// 创建一个默认的路由器router := gin.Default()// gin.Context是一个结构体,包含了请求和响应的细节, 封装request和response// 无参数路由router.GET("/",HelloWorldhandler)// 返回字符串router.GET("/string", ResponseStringHandle)// 返回jsonrouter.GET("/json", ResponseJsonHandler)// 动态路由参数router.GET("/book/:id", GetBookDetailHandler)// 查询参数 Query 或 DefaultQueryrouter.GET("/user/", GetUserDetailHandlers)// 参数绑定router.POST("/login", Loginhandler)// 路由重定向router.GET("/re", func(c *gin.Context) {c.Redirect(http.StatusMovedPermanently, "https://www.baidu.com")})// 启动服务器router.Run(":8081")
}
路由分发
为什么需要路由分发?
- 我们一个项目有非常多的模块,如果全部写在一块导致代码结构混乱,不利于后续的扩展
- 按照大的模块,每个模块有自己独立的路由,主路由可以再main.go中进行注册
项目结构
├── go.mod
├── go.sum
├── main.go
└── routers├── books.go└── users.go
main.go
import (
"days/routers"
"fmt"
"github.com/gin-gonic/gin"
)
func main() {router := gin.Default()// 全局中间件router.Use(MiddleWare())// 加载路由routers.LoadUsers(router)routers.LoadBooks(router)router.Run(":8081")
}
routers/users.go
package routers
import ("fmt""github.com/gin-gonic/gin""net/http""time"
)func LoadUsers(e *gin.Engine) {e.GET("/user",MiddleWareOne(),UserHandler)
}func UserHandler(c *gin.Context) {fmt.Println("我是用户路由")time.Sleep(time.Second * 5)c.JSON(http.StatusOK,gin.H{"message" : "weclome user",})
}
routers/books.go
package routers
import (
"net/http"
"github.com/gin-gonic/gin"
)
func LoadBooks(e *gin.Engine) {e.GET("/book", GetBookHandler)
}
func GetBookHandler(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "Book Router",})
}
中间件
- Gin框架允许开发者在处理请求的过程中,加入用户自己的钩子(Hook)函数。
- 这个钩子函数就叫中间件,中间件适合处理一些公共的业务逻辑
- 比如登录认证、权限校验、数据分页、记录日志、耗时统计等
全局中间件
func Logger() gin.HandlerFunc {return func(c *gin.Context) {start := time.Now()c.Next()latency := time.Since(start)fmt.Printf("请求耗时: %v\n", latency)}
}func main() {r := gin.Default()r.Use(Logger()) // 全局生效r.GET("/", func(c *gin.Context) { /* ... */ })
}
局部中间件
func AuthMiddleware() gin.HandlerFunc {return func(c *gin.Context) {token := c.GetHeader("token")if token != "SECRET_KEY" {c.AbortWithStatusJSON(401, gin.H{"error": "身份验证失败"})}c.Next()}
}r.GET("/profile", AuthMiddleware(), func(c *gin.Context) {c.JSON(200, gin.H{"data": "用户信息"})
})
next()方法
- 在中间件中调用next()方法,会从next()方法调用的地方跳转到Handler函数
- Handler函数执行完成,若中间件还有部分代码未执行(中间件中next()之后的代码),则执行该代码
package mainimport ("fmt""github.com/gin-gonic/gin""net/http""time"
)func main() {r := gin.Default()r.Use(Log(), RequestID())r.GET("/", func(c *gin.Context) {fmt.Println("app running 1")time.Sleep(time.Second * 5)c.String(http.StatusOK, "hello World!")})r.Run()
}
func Log() gin.HandlerFunc {return func(c *gin.Context) {fmt.Println("log start")c.Next()fmt.Println("log end")}
}
func RequestID() gin.HandlerFunc {return func(c *gin.Context) {fmt.Println("requestid start")c.Next()fmt.Println("requestid end")}
}
实现token认证
- http://127.0.0.1:8080/index index首页无需token直接访问
- http://127.0.0.1:8080/home home家目录需要对token进行验证,验证通过才可访问
package mainimport ("fmt""github.com/gin-gonic/gin"
)func AuthMiddleWare() func(c *gin.Context) {return func(c *gin.Context){// 客户端携带token 有三种方式 1.放在请求头 2.放在请求体 3.放在url// token 验证成功,返回 c.next()才会继续,否则 c.Abort()token := c.Request.Header.Get("token")fmt.Println("获取token:",token)if token == "" {c.JSON(200, gin.H{"code": 401,"msg": "身份验证不通过",})c.Abort()}if token != "123456" {c.JSON(200, gin.H{"code": 401,"msg": "token错误",})c.Abort()}}
}func main() {router := gin.Default()// 首页无需验证router.GET("/", func(c *gin.Context) {c.JSON(200, gin.H{"message": "首页",})})// Home页面需要验证router.GET("/home", AuthMiddleWare(), func(c *gin.Context) {c.JSON(200, gin.H{"message": "Home页面",})})router.Run(":8081")
}
相关文章:
Gin框架从入门到实战:核心用法与最佳实践
为什么选择Gin框架? Gin 是一个基于 Go 语言的高性能 Web 框架,具备以下优势: 轻量高效:底层依赖 net/http,性能接近原生。简洁优雅:API 设计友好,支持路由分组、中间件链、参数绑定等特性。生…...
PyTorch 的 nn.NLLLoss:负对数似然损失全解析
PyTorch 的 nn.NLLLoss:负对数似然损失全解析 在 PyTorch 的损失函数家族中,nn.NLLLoss(Negative Log Likelihood Loss,负对数似然损失)是一个不太起眼但非常重要的成员。它经常跟 LogSoftmax 搭配出现,尤…...
ROS2软件调用架构和机制解析:Publisher创建
术语 DDS (Data Distribution Service): 用于实时系统的数据分发服务标准,是ROS 2底层通信的基础RMW (ROS Middleware): ROS中间件接口,提供与具体DDS实现无关的抽象APIQoS (Quality of Service): 服务质量策略,控制通信的可靠性、历史记录、…...
vue2 以及vue3中 v-if和v-for是否可以同时使用
vue2以及vue3官方文档中都明确的指出 避免 v-if 和 v-for 用在一起 vue2 官方文档 解释 在 Vue 2 中,v-for 的优先级高于 v-if,也就是说,Vue 2 在渲染时,会先处理 v-for 生成列表项,再对子项判断 v-if 是否渲染。 …...
Hbase伪分布安装教程,详细版
注意Hbase版本与Hadoop版本的兼容,还有与JDK版本的兼容 本次用到的Hbase为2.4.6版本,Hadoop为3.1.3版本,JDK为JDK8 打开下面的网址查看兼容问题 Apache HBase Reference Guidehttps://hbase.apache.org/book.html#configuration 点击基础先…...
SSL: CERTIFICATE_VERIFY_FAILED Error in Python 是什么问题?
在最新版本的Stable Diffusion webui 版本上使用最新下载的模型时,出现了类似的错误。 SSL: CERTIFICATE_VERIFY_FAILED 错误在Python中通常表示你的程序试图通过HTTPS连接到某个服务器,但Python无法验证该服务器提供的SSL证书。这可能是因为以下几种原…...
15Metasploit框架介绍
metasploit目录结构 MSF ——the metasploit framework 的简称。MSF高度模块化,即框架结构由多个module组成,是全球最受欢迎的工具 是一筐开源安全漏洞利用和测试工具,集成了各种平台上常见的溢出漏洞和流行sheellcode,并且保持…...
【Qt】ffmpeg解码—照片提取、视频播放▲
目录 一、图像的成像原理: RGB成像原理: YUV成像原理: 二、多线程 三、ffmpeg解码(照片提取) 1.准备工作 (1)在工程文件夹里面新建三个文件夹 (2)在main函数中加…...
Springboot整合WebSocket+Redis以及微信小程序如何调用
一、 Springboot整合WebSocket 1. 引入socket依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency>引入依赖后需要刷新maven,Websocket的版本默认跟随S…...
HOW - 在Windows浏览器中模拟MacOS的滚动条
目录 一、原生 CSS 代码实现模拟 macOS 滚动条额外优化应用到某个特定容器 二、Antd table中的滚动条场景三、使用第三方工具/扩展 如果你想让 Windows 里的滚动条 模拟 macOS 的效果(细窄、圆角、隐藏默认轨道)。 可以使用以下几种方案: 一…...
openEuler环境下GlusterFS分布式存储集群部署指南
1.环境准备: os:openEuler 22.03 主机名 IP地址 主机用途 Rocky8192.168.121.160客户端 open-Euler1192.168.121.150节点1,提供两块6G硬盘open-Euler4192.168.121.153节点2,提供两块6G硬盘open-Euler5192.168.121.154 …...
C++学习(七)(标准库+STL(iotstream公司,日期/时间,器皿,算法,迭代器,多线程))
C 标准模板库 (STL) C 标准模板库 (STL) 是头文件的集合,提供了多种数据结构、算法和函数,以简化您的 C 编码体验。STL 的主要目的是通过提供一套现成的有用工具来节省时间并提高效率。STL 最常用的功能可…...
c高级第五天
1> 在终端提示输入一个成绩,通过shell判断该成绩的等级 [90,100] : A [80, 90) : B [70, 80) : C [60, 70) : D [0, 60) : 不及格 #!/bin/bash# 提示用户输入成绩 read -p "请输入成绩(0-100):" score# 判断成…...
Windows上使用go-ios实现iOS17自动化
前言 在Windows上运行iOS的自动化,tidevice对于iOS17以上并不支持,原因是iOS 17 引入新通信协议 RemoteXPCQUIC,改变了 XCUITest 的启动方式。 一、go-ios的安装 1、安装命令:npm i go-ios 2、安装完成后输入命令which io…...
迷你世界脚本小地图接口:Mapmark
小地图接口:Mapmark 彼得兔 更新时间: 2023-10-25 10:33:48 具体函数名及描述如下: 序号 函数名 函数描述 1 newShape(...) 新增一个形状(线,矩形,圆形) 2 deleteShape(...) 删除一个形状 3 setShapeColor(...) 设置…...
TMS320F28P550SJ9学习笔记1:CCS导入工程以及测试连接单片机仿真器
学习记录如何用 CCS导入工程以及测试连接单片机仿真器 以下为我的CCS 以及驱动库C2000ware 的版本 CCS版本: Code Composer Studio 12.8.1 C2000ware :C2000Ware_5_04_00_00 目录 CCS导入工程: 创建工程: 添加工程: C…...
为什么要提倡尽早返回(Early Return)
为什么要提倡尽早返回(Early Return) 在编程中,“尽早返回”(Early Return)是一种常被提倡的编程方式,特别是在需要提升代码可读性、减少嵌套层级、以及快速处理异常情况时。本文将讨论尽早返回的优点、应…...
Gartner发布安全运营指标构建指南
如何为安全运营指标构建坚实的基础 安全运营经理需要报告威胁检测、调查和响应计划的有效性,但难以驾驭大量潜在的 SOC 指标。本研究提供了设计针对 SOC 的指标系统的示例和实践。 主要发现 需要清晰、一致的衡量标准来向董事会成员或服务提供商等更广泛的团队传达…...
vue3:初学 vue-router 路由配置
承上一篇:nodejs:express js-mdict 作为后端,vue 3 vite 作为前端,在线查询英汉词典 安装 cnpm install vue-router -S 现在讲一讲 vue3:vue-router 路由配置 cd \js\mydict-web\src mkdir router cd router 我还…...
数据结构入门篇——什么是数据结构。
一、引入 工具是一种什么东西呢?是一种转化媒介,我们需要熟食,我们要通过用火来将生肉烤熟。在这个过程中。我们要输入一个东西——生肉,通过工具——火的加工,从而得到我们的目的产物——熟肉。 将上面的例子和红字部…...
uniapp+vue3搭建项目
工具使用: Pinia Vue 3 官方推荐的状态管理库,比 Vuex 更轻量,支持模块化,结合 persistedstate 插件可以持久化存储数据。uView-plus 专为 UniApp 设计,支持 App、小程序、H5。UnoCSS 更轻量,比 TailwindCS…...
unity大坐标抖动处理测试
第二幅图就是相机坐标是0 6360094 0的地方看见的模型,可以看见这个球体已经烂了 那么这里可以知道的是坐标太大了导致的,那么把所有物体共同偏移一下,即可得到第一幅图的效果,圆润的sphere又回来了 浮点数的计算是需要位数的&…...
CASAIM与承光电子达成深度合作,三维扫描逆向建模技术助力车灯设计与制造向数字化与智能化转型
近日,CASAIM与广州承光电子科技有限公司正式达成深度合作,CASAIM将为承光电子提供全方位的技术支持,包括高精度三维扫描设备、逆向建模软件以及定制化的技术解决方案。双方将共同组建技术团队,针对车灯设计中的难点进行攻关&#…...
C++类与对象:银行管理系统项目实战开发LeetCode每日一题
[Bank-Management-System]银行管理系统项目 以下是一个可运行的C银行账户类(支持简单的存款/取款)。后面会继续完善该项目: #include <iostream> #include <string> using namespace std;class Account{public://构造函数Accou…...
领域驱动设计:事件溯源架构简介
概述 事件溯源架构通常由3种应用设计模式组成,分别是:事件驱动(Event Driven),事件溯源(Event Source)、CQRS(读写分离)。这三种应用设计模式常见于领域驱动设计(DDD)中,但它们本身是一种应用设计的思想,不仅仅局限于DDD,每一种模式都可以单独拿出来使用。 E…...
景联文科技:以专业标注赋能AI未来,驱动智能时代的精准跃迁
在人工智能技术重塑全球产业格局的今天,高质量训练数据已成为驱动算法进化的核心燃料。作为数据智能服务领域的领军者,景联文科技深耕数据标注行业多年,以全栈式数据解决方案为核心,构建起覆盖数据采集、清洗、标注、质检及算法调…...
LeetCode 热题 100----1.两数之和
LeetCode 热题 100----1.两数之和 题目描述 我的解法 语言:js 思路就是:用双重循环去找哪两个数字相加等于target,目前的时间复杂度为O(n2),之后右优化思路再更新。...
GIT 常用命令
/ 一、环境: ssh-keygen -t rsa -C "wangxiaoerqq.com.cn" 生成本地秘钥(邮箱换成自己的邮箱) 使用cat ~/.ssh/id_rsa.pub查看秘钥 git config --global user.name "wangxiaoer" git config --global wangxiaoerqq.…...
Netty笔记13:序列化
Netty笔记1:线程模型 Netty笔记2:零拷贝 Netty笔记3:NIO编程 Netty笔记4:Epoll Netty笔记5:Netty开发实例 Netty笔记6:Netty组件 Netty笔记7:ChannelPromise通知处理 Netty笔记8…...
IntelliJ IDEA 构建项目时内存溢出问题
问题现象 在使用 IntelliJ IDEA 构建 Java 项目时,遇到了以下错误: java: java.lang.OutOfMemoryError: Java heap space java.lang.RuntimeException: java.lang.OutOfMemoryError: Java heap space这是一个典型的 Java 堆内存不足错误,表…...
Asp.Net Core WebAPI开发教程(入门)
一、Asp.Net Core WebAPI项目创建 二、Asp.Net Core WebApi/Mvc路由定义 二、Asp.Net Core WebAPI 请求案例 Asp.Net WebApi Get请求整理(一) Asp.Net WebApi Post请求整理(一) Asp.Net WebApi Action命名中已‘Get’开头问题 …...
golang 内存对齐和填充规则
内存对齐和填充规则 对齐要求:每个数据类型的起始地址必须是其大小的倍数。 int8(1字节):不需要对齐。int16(2字节):起始地址必须是2的倍数。int32(4字节):起…...
MySQL执行更新SQL流程
目录 1 redo log 2 binlog 3 Update执行逻辑 1 redo log InnoDB引擎特有日志MySQL的WAL(Writing Ahead logging)技术,预写式日志,先写日志再写磁盘当有一条记录需要更新时,InnoDB引擎就会先把记录写在redo log日志中&a…...
【时序预测】在线学习:算法选择(从线性模型到深度学习解析)
——如何为动态时序预测匹配最佳增量学习策略? 引言:在线学习的核心价值与挑战 在动态时序预测场景中(如实时交通预测、能源消耗监控),数据以流式(Streaming)形式持续生成,且潜在的…...
CISC架构
基本概念 CISC 架构是一种计算机处理器设计架构,其设计理念与 RISC 架构相对。CISC 架构强调通过使用大量功能复杂的指令来增强计算机的处理能力,试图让计算机用一条指令就能完成较为复杂的操作,以减少程序中指令的总数,提高程序…...
Vue前端开发- Vant之Card组件
业务组件是Vant的一大特点,特别是针对移动端商城开发的业务,有许多组件可以直接运用到通用商城的开发中,代码也十分简单,大大加快了应用的开发速度。 在众多的业务组件中,Card 卡片、Coupon 优惠券选择器和SubmitBar …...
React Refs:深入理解与最佳实践
React Refs:深入理解与最佳实践 引言 在React中,refs是用于访问DOM元素或组件实例的一种方式。与类组件的ref属性不同,函数组件的ref需要使用useRef钩子。正确使用refs可以大大提升React应用的性能和可维护性。本文将深入探讨React Refs的原…...
Linux——基本指令
我们今天学习Linux最基础的指令 ls 指令 语法: ls [选项] [⽬录或⽂件] 功能:对于⽬录,该命令列出该⽬录下的所有⼦⽬录与⽂件。对于⽂件,将列出⽂件名以及其他信 息。 命令中的选项,一次可以传递多个 ,…...
【MySQL系列文章】Linux环境下安装部署MySQL
前言 本次安装部署主要针对Linux环境进行安装部署操作,系统位数64 getconf LONG_BIT 64MySQL版本:v5.7.38 一、下载MySQL MySQL下载地址:MySQL :: Download MySQL Community Server (Archived Versions) 二、上传MySQL压缩包到Linuxx环境,…...
【mysql】表信息无法获取与插入数据错误
一:无法获取表信息 处理流程分析 初始问题:get_room_member_list 函数调用后,未能收到预期的群成员列表回调 Error: not all arguments converted during string formatting 127.0.0.1 - - [26/Feb/2025 11:55:32] "POST / HTTP/1.1&qu…...
七、Redis 内存管理详解:模型、优化策略(LRU/LFU、对象共享)
Redis 内存管理详解:模型、优化策略(LRU/LFU、对象共享) Redis 以高性能和低延迟著称,但作为基于内存的数据库,内存管理是其核心问题之一。本文将深入解析 Redis 的内存模型、内存优化策略(包括 LRU/LFU 机制、对象共享等),帮助开发者提高 Redis 的存储效率和性能。 1…...
如何调试Linux内核?
通过创建一个最小的根文件系统,并使用QEMU和GDB进行调试。 1.准备工作环境 确保系统上安装了所有必要的工具和依赖项。 sudo apt-get update //更新一下软件包 sudo apt-get install build-essential git libncurses-dev bison flex libssl-dev qemu-system-x…...
Pywinauto Recorder: 将Windows操作转化为Python脚本,高效简易地实现操作自动化
Pywinauto Recorder是一个强大的UI自动化工具,它能够记录用户在Windows应用程序上的操作,并将其转换为可执行的Python脚本。这意味着你可以轻松地将重复性的GUI操作自动化,提高效率并降低人为错误。 什么是Pywinauto Recorder? …...
【AI大模型】DeepSeek + Kimi 高效制作PPT实战详解
目录 一、前言 二、传统 PPT 制作问题 2.1 传统方式制作 PPT 2.2 AI 大模型辅助制作 PPT 2.3 适用场景对比分析 2.4 最佳实践与推荐 三、DeepSeek Kimi 高效制作PPT操作实践 3.1 Kimi 简介 3.2 DeepSeek Kimi 制作PPT优势 3.2.1 DeepSeek 优势 3.2.2 Kimi 制作PPT优…...
Spring统一格式返回
目录 一:统一结果返回 1:统一结果返回写法 2:String类型报错问题 解决方法 二:统一异常返回 统一异常返回写法 三:总结 同志们,今天咱来讲一讲统一格式返回啊,也是好久没有讲过统一格式返…...
【商城实战(2)】商城架构设计:从底层逻辑到技术实现
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
Netty笔记6:Netty组件
Netty笔记1:线程模型 Netty笔记2:零拷贝 Netty笔记3:NIO编程 Netty笔记4:Epoll Netty笔记5:Netty开发实例 Netty笔记6:Netty组件 Netty笔记7:ChannelPromise通知处理 Netty笔记8…...
大模型学习笔记------Llama 3模型架构简介
大模型学习笔记------Llama 3模型架构 1、整体网络结构2、主要创新点3、其他关键改进点 LLaMA(Large Language Model Meta AI)系列模型是Meta发布并开源,分别在2023年2月、2023年7月和2024年4月发布了经历了LLaMA 1、LLaMA 2和LLaMA 3模型。本文只讲相对比较成熟、性…...
DeepSeek本地接口调用(Ollama)
前言 上篇博文,我们通过Ollama搭建了本地的DeepSeek模型,本文主要是方便开发人员,如何通过代码或工具,通过API接口调用本地deepSeek模型 前文:DeepSeek-R1本地搭建_deepseek 本地部署-CSDN博客 注:本文不仅…...
C语言:51单片机 基础知识
一、单片机概述 单片机的组成及其特点 单片机是指在一块芯片上集成了CPU、ROM、RAM、定时器/计数器和多种I/O接口电路等,具有一定规模的微型计算机。 特点: 1、单片机的存储器以ROM、RAM严格分工。 2、采用面向控制的指令系统。 3、单片机的I/O口引脚通…...