golang,gin框架的请求参数(一)--推荐
golang,gin框架的请求参数(一)
gin框架的重要性不过多的强调,重点就gin使用中的参数传递,获取进行梳理文件,满足使用需求。
获取前端请求参数的几种方法:
一、获取参数【浏览器地址获取参数】
1.浏览器地址栏获取参数
1.获取 URL (query)参数
例如:/user/search?username=zhangsan&address=北京。 获取请求的query参数的方法如下:
URL 参数可以通过DefaultQuery() 和 Query() 两个参数获取
这两个【DefaultQuery() 和 Query() 】的区别就是,DefaultQuery()可以放个默认参数,如果没有存参数那么就是使用默认参数,
Query()如果不给参数,就是默认为“”
示例:
1.1后端代码:
package mainimport ("github.com/gin-gonic/gin""net/http"
)// /user/search?username=zhangsan&address=北京
// urlQuery 获取 url中?后面携带的参数
func urlQueryHandle(ctx *gin.Context) {// 如果指定的key 没有对应的值就使用默认值username1 := ctx.DefaultQuery("username", "lisi")// 根据key 获取值username2 := ctx.Query("username")address := ctx.Query("address")// 返回JSON 字符串ctx.JSON(http.StatusOK, gin.H{"message": "ok","username1": username1,"username2": username2,"address": address,})
}
func main() {// 创建默认路由r := gin.Default()// 绑定路由规则r.GET("/user/search", urlQueryHandle)// 监听端口r.Run(":9000")
}
1.2浏览器访问,从中可以看到我们没有给任何参数,后端Query查询的都是为“”

1.3带参数的访问
http://127.0.0.1:9000/user/search?username=tom&address=xian&username=jerry
?username=tom&address=xian&username=jerry

1.3.1postman获取参数

2.获取参数【获取Path参数(RestFul风格)】
请求的参数通过URL路径传递,例如:/user/search/lisi/北京。 获取请求URL路径中的参数的方式如下。

以下代码是上述两种浏览器获取参数的办法,具体看代码品味下;
package mainimport ("github.com/gin-gonic/gin""net/http"
)// /user/search?username=zhangsan&address=北京
// urlQuery 获取 url中?后面携带的参数
func urlQueryHandle(ctx *gin.Context) {// 如果指定的key 没有对应的值就使用默认值username1 := ctx.DefaultQuery("username", "lisi")// 根据key 获取值username2 := ctx.Query("username")address := ctx.Query("address")// 返回JSON 字符串ctx.JSON(http.StatusOK, gin.H{"message": "ok","username1": username1,"username2": username2,"address": address,})
}// /user/search/lisi/北京。 获取请求URL路径中的参数的方式如下
// paramsPathHandle 获取url path中参数
func paramsPathHandle(ctx *gin.Context) {// 获取参数值username := ctx.Param("username")address := ctx.Param("address")// 数据返回ctx.JSON(http.StatusOK, gin.H{"message": "ok","username": username,"address": address,})
}func main() {// 创建默认路由r := gin.Default()//两种浏览器地址获取参数的办法// 绑定路由规则 /user/search?username=zhangsan&address=北京r.GET("/user/search", urlQueryHandle)// 2. 绑定路由规则/user/search/lisi/北京。 获取请求URL路径中的参数的方式如下r.GET("/user/search/:username/:address", paramsPathHandle)// 监听端口r.Run(":9000")
}
二、表单获取参数获取 Form参数
表单提交POST请求时,http常见的传输格式有四种application/json (json格式)
- text/plain (text格式)
- application/x-www-form-urlencode(表单默认提交格式)
- application./xml (xml格式)
- multipart/form-data( 文件上传)
可以通过 DefaultPostForm() 和 PostForm() 两个方法获取(默认解析的是 x-www-form-urlencode 和 form-data 格式的参数)
2.1获取form表单数据
2.1.1application/x-www-form-urlencode(表单默认提交格式)
因为发起post请求,前端只能用postman模拟了

返回结果

2.1.2form-data表单提交方式

2.2获取json参数【ctx.GetRowData()】
2.2.1请求数据application./json(json格式)

2.2.2 application./xml (xml格式)

2.3文件上传事项
2.3.1文件上传接收的文件格式要求:
格式是: multipart/form-data

2.3.2多文件上传

2.4表单数据获取的代码
package mainimport ("encoding/json""fmt""github.com/gin-gonic/gin""net/http"
)// /user/search?username=zhangsan&address=北京
// urlQuery 获取 url中?后面携带的参数
func urlQueryHandle(ctx *gin.Context) {// 如果指定的key 没有对应的值就使用默认值username1 := ctx.DefaultQuery("username", "lisi")// 根据key 获取值username2 := ctx.Query("username")address := ctx.Query("address")// 返回JSON 字符串ctx.JSON(http.StatusOK, gin.H{"message": "ok","username1": username1,"username2": username2,"address": address,})
}// /user/search/lisi/北京。 获取请求URL路径中的参数的方式如下
// paramsPathHandle 获取url path中参数
func paramsPathHandle(ctx *gin.Context) {// 获取参数值username := ctx.Param("username")address := ctx.Param("address")// 数据返回ctx.JSON(http.StatusOK, gin.H{"message": "ok","username": username,"address": address,})
}//=================================// formParamsHandle 获取form表单提交数据
func formParamsHandle(ctx *gin.Context) {// 获取不到值时就是用默认值username1 := ctx.DefaultPostForm("username", "lisi")username2 := ctx.PostForm("username")address := ctx.PostForm("address")// 以Json 字符串的形式返回ctx.JSON(http.StatusOK, gin.H{"message": "ok","username1": username1,"username2": username2,"address": address,})
}// json参数
// paramsJsonHandle 获取json字符串相关的参数
func paramsJsonHandle(ctx *gin.Context) {// 获取request.Body() 中的数据(这里没有进行错误处理)// 返回的是字节数组dataBytes, _ := ctx.GetRawData()// 定义一个mapvar m map[string]interface{}// 反序列化 别忘了&_ = json.Unmarshal(dataBytes, &m)// 数据返回ctx.JSON(http.StatusOK, m)}//文件上传
/*单个文件上传文件上传接收的文件格式是: multipart/form-data
*/// singleFileUploadHandle 当文件上传
func singleFileUploadHandle(ctx *gin.Context) {// 获取文件// 根据上传时的参数名获取上传的文件内容 --> 返回对象为 *multipart.FileHeaderfileHeader, err := ctx.FormFile("file")if err != nil {ctx.JSON(http.StatusInternalServerError, gin.H{"message": err.Error(),})return}// 保存文件内容// 拼接文件名, 这里直接写死了targetFileName := fmt.Sprintf("C:/Users/黑熊精/Pictures/%s", fileHeader.Filename)//targetFileName := fmt.Sprintf("%s", fileHeader.Filename)// 将文件保存到指定的目录err = ctx.SaveUploadedFile(fileHeader, targetFileName)if err != nil {ctx.JSON(http.StatusInternalServerError, gin.H{"message": err.Error(),})} else {ctx.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("%s upload success!", fileHeader.Filename),})}
}//多文件上传/**多文件上传
*/// multiFileUploadHandle 多文件上传
func multiFileUploadHandle(ctx *gin.Context) {// form 是一个存储文件信息的结构体/**type Form struct {Value map[string][]stringFile map[string][]*FileHeader*/form, err := ctx.MultipartForm()if err != nil {ctx.JSON(http.StatusInternalServerError, gin.H{"message": err.Error(),})return}// 获取文件列表,并保存, 返回的是一个切片 []*FileHeaderfiles := form.File["file"]for i, file := range files {targetFileName := fmt.Sprintf("C:/Users/黑熊精/Pictures/%d_%s", i, file.Filename)err = ctx.SaveUploadedFile(file, targetFileName)if err != nil {ctx.JSON(http.StatusInternalServerError, gin.H{"message": err.Error(),})return}}ctx.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("upload success!"),})
}func main() {// 创建默认路由r := gin.Default()//两种浏览器地址获取参数的办法// 绑定路由规则 /user/search?username=zhangsan&address=北京r.GET("/user/search", urlQueryHandle)// 2. 绑定路由规则/user/search/lisi/北京。 获取请求URL路径中的参数的方式如下r.GET("/user/search/:username/:address", paramsPathHandle)//========================表单提交方法======================// 绑定路由规则r.POST("/user/search", formParamsHandle)//json// 绑定路由规则r.POST("/user/json", paramsJsonHandle)//// 绑定路由规则--文件上传r.POST("/upload/single", singleFileUploadHandle)绑定路由规则--多文件上传r.POST("/upload/multi", multiFileUploadHandle)// 监听端口r.Run(":9000")
}
2.5参数绑定--优化数据方式
使用 ShouldBind() 方法, 根据请求方式,自动提取 JSON, form表单 和 Query 类型的参数,放入结构体中
2.5.1url query参数解析


2.5.2form表单参数解析

2.5.3json 数据解析

三、程序的所有代码
package mainimport ("encoding/json""fmt""github.com/gin-gonic/gin""net/http"
)// /user/search?username=zhangsan&address=北京
// urlQuery 获取 url中?后面携带的参数
func urlQueryHandle(ctx *gin.Context) {// 如果指定的key 没有对应的值就使用默认值username1 := ctx.DefaultQuery("username", "lisi")// 根据key 获取值username2 := ctx.Query("username")address := ctx.Query("address")// 返回JSON 字符串ctx.JSON(http.StatusOK, gin.H{"message": "ok","username1": username1,"username2": username2,"address": address,})
}// /user/search/lisi/北京。 获取请求URL路径中的参数的方式如下
// paramsPathHandle 获取url path中参数
func paramsPathHandle(ctx *gin.Context) {// 获取参数值username := ctx.Param("username")address := ctx.Param("address")// 数据返回ctx.JSON(http.StatusOK, gin.H{"message": "ok","username": username,"address": address,})
}//=================================// formParamsHandle 获取form表单提交数据
func formParamsHandle(ctx *gin.Context) {// 获取不到值时就是用默认值username1 := ctx.DefaultPostForm("username", "lisi")username2 := ctx.PostForm("username")address := ctx.PostForm("address")// 以Json 字符串的形式返回ctx.JSON(http.StatusOK, gin.H{"message": "ok","username1": username1,"username2": username2,"address": address,})
}// json参数
// paramsJsonHandle 获取json字符串相关的参数
func paramsJsonHandle(ctx *gin.Context) {// 获取request.Body() 中的数据(这里没有进行错误处理)// 返回的是字节数组dataBytes, _ := ctx.GetRawData()// 定义一个mapvar m map[string]interface{}// 反序列化 别忘了&_ = json.Unmarshal(dataBytes, &m)// 数据返回ctx.JSON(http.StatusOK, m)}//文件上传
/*单个文件上传文件上传接收的文件格式是: multipart/form-data
*/// singleFileUploadHandle 当文件上传
func singleFileUploadHandle(ctx *gin.Context) {// 获取文件// 根据上传时的参数名获取上传的文件内容 --> 返回对象为 *multipart.FileHeaderfileHeader, err := ctx.FormFile("file")if err != nil {ctx.JSON(http.StatusInternalServerError, gin.H{"message": err.Error(),})return}// 保存文件内容// 拼接文件名, 这里直接写死了targetFileName := fmt.Sprintf("C:/Users/黑熊精/Pictures/%s", fileHeader.Filename)//targetFileName := fmt.Sprintf("%s", fileHeader.Filename)// 将文件保存到指定的目录err = ctx.SaveUploadedFile(fileHeader, targetFileName)if err != nil {ctx.JSON(http.StatusInternalServerError, gin.H{"message": err.Error(),})} else {ctx.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("%s upload success!", fileHeader.Filename),})}
}//多文件上传/**多文件上传
*/// multiFileUploadHandle 多文件上传
func multiFileUploadHandle(ctx *gin.Context) {// form 是一个存储文件信息的结构体/**type Form struct {Value map[string][]stringFile map[string][]*FileHeader*/form, err := ctx.MultipartForm()if err != nil {ctx.JSON(http.StatusInternalServerError, gin.H{"message": err.Error(),})return}// 获取文件列表,并保存, 返回的是一个切片 []*FileHeaderfiles := form.File["file"]for i, file := range files {targetFileName := fmt.Sprintf("C:/Users/黑熊精/Pictures/%d_%s", i, file.Filename)err = ctx.SaveUploadedFile(file, targetFileName)if err != nil {ctx.JSON(http.StatusInternalServerError, gin.H{"message": err.Error(),})return}}ctx.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("upload success!"),})
}// shuldbind数据的绑定的办法
// 使用 ShouldBind() 方法, 根据请求方式,自动提取 JSON, form表单 和 Query 类型的参数,放入结构体中
// 用户信息信息结构体
// 加上 binding:"required" 标签,说明该参数是必填的,如果不填就会报错
type UserInfo struct {Username string `json:"username" form:"username" binding:"required"`Address string `json:"address" form:"address" binding:"required"`
}// 获取query参数
func queryHandle(ctx *gin.Context) {var userInfo UserInfo// 获取数据err := ctx.ShouldBind(&userInfo)if err == nil {ctx.JSON(http.StatusOK, gin.H{"message": "ok","username": userInfo.Username,"address": userInfo.Address,})} else {ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})}
}func jsonHandle(ctx *gin.Context) {var userInfo UserInfo// 获取数据err := ctx.ShouldBind(&userInfo)if err == nil {ctx.JSON(http.StatusOK, gin.H{"message": "ok","username": userInfo.Username,"address": userInfo.Address,})} else {ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})}
}func fromHandle(ctx *gin.Context) {var userInfo UserInfo// 获取数据err := ctx.ShouldBind(&userInfo)if err == nil {ctx.JSON(http.StatusOK, gin.H{"message": "ok","username": userInfo.Username,"address": userInfo.Address,})} else {ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})}
}func main() {// 创建默认路由r := gin.Default()//两种浏览器地址获取参数的办法// 绑定路由规则 /user/search?username=zhangsan&address=北京r.GET("/user/search", urlQueryHandle)// 2. 绑定路由规则/user/search/lisi/北京。 获取请求URL路径中的参数的方式如下r.GET("/user/search/:username/:address", paramsPathHandle)//========================表单提交方法======================// 绑定路由规则r.POST("/user/search", formParamsHandle)//json// 绑定路由规则r.POST("/user/json", paramsJsonHandle)//// 绑定路由规则--文件上传r.POST("/upload/single", singleFileUploadHandle)绑定路由规则--多文件上传r.POST("/upload/multi", multiFileUploadHandle)//使用 ShouldBind() 方法, 根据请求方式,自动提取 JSON, form表单 和 Query 类型的参数,放入结构体中// 绑定路由规则r.GET("/user/query", queryHandle)r.POST("/user/form", fromHandle)r.POST("/user/jsons", jsonHandle)// 监听端口r.Run(":9000")
}
相关文章:
golang,gin框架的请求参数(一)--推荐
golang,gin框架的请求参数(一) gin框架的重要性不过多的强调,重点就gin使用中的参数传递,获取进行梳理文件,满足使用需求。 获取前端请求参数的几种方法: 一、获取参数【浏览器地址获取参数】…...
ardupilot 遥控的输入控制模式
目录 本节主要记录自己整理ardupilot的遥控器的输入控制模式:正常模式、简单模式、超简单模式的理解。 1.正常模式(有头模式) 在不用简单和超简单的模式的情况下,无人机操作员操作的控制输入是对应着不断旋转着的飞行器进行操作的。如上方图所示举例,当无人机操作员进行…...
Unity UGUI的StandaloneInputModule (标准输入模块)组件的介绍及使用
Unity UGUI的StandaloneInputModule (标准输入模块)组件的介绍及使用 1. 什么是StandaloneInputModule组件? StandaloneInputModule是Unity UGUI系统中的一个标准输入模块组件,用于处理鼠标和键盘的输入事件。它可以将鼠标和键盘的输入转化为UGUI系统中…...
惠普HP Color Laser 150a开机红色感叹号闪烁不打印故障解决方法
故障描述: 惠普HP Color Laser 150a开机红色感叹号闪烁,不能打印,电脑提示C3-6140。 检测分析: 在解决C3-6140错误代码之前,我们需要先检查打印机是否连接正常。如果打印机连接不正常,也可能会出现这个错误…...
CVE-2023-1454注入分析复现
简介 JeecgBoot的代码生成器是一种可以帮助开发者快速构建企业级应用的工具,它可以通过一键生成前后端代码,无需写任何代码,让开发者更多关注业务逻辑。 影响版本 Jeecg-Boot<3.5.1 环境搭建 idea 后端源码: https://git…...
MFC使用png做背景图片
在MFC中使用png图片作为背景,你需要使用GDI库。以下是一个简单的示例: 首先,你需要在你的项目中包含GDI头文件和库。在你的stdafx.h(或者你的项目预编译头文件)中添加以下代码: #include <GdiPlus.h&g…...
Java开发的基石:JDK
Java开发的基石:JDK 前言一、引入二、JDK的发展历程三、JDK主要目录结构解析四、JDK的使用 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快&…...
使用langchain与你自己的数据对话(三):检索(Retrieval)
之前我已经完成了使用langchain与你自己的数据对话的前两篇博客,还没有阅读这两篇博客的朋友可以先阅读一下: 使用langchain与你自己的数据对话(一):文档加载与切割使用langchain与你自己的数据对话(二):向量存储与嵌入 今天我们…...
DEVICENET转ETHERNET/IP网关devicenet协议
捷米JM-EIP-DNT,你听说过吗?这是一款自主研发的ETHERNET/IP从站功能的通讯网关,它能够连接DEVICENET总线和ETHERNET/IP网络,从而解决生产管理系统中协议不同造成的数据交换互通问题。 这款产品在工业自动化领域可谓是一大利器&…...
GPT一键化身「AI助理」——自定义指令功能
最近GPT又更新了一个超实用的功能——自定义指令,启用后,你可以给GPT设置一些固定指令,让它记住或扮演某个角色,比如客服、律师、投资管理师、老师、营养师...... 这样,我们就不再需要每次都要打开新的聊天,…...
深入理解Promise
原文合集地址如下,有需要的朋友可以关注 本文地址 合集地址 什么是Promise 当谈论 Promise 时,可以将其比喻为一种承诺或契约,用于处理异步操作的结果。异步操作是指那些不会立即完成的操作,比如从服务器获取数据、读取文件、发送网络请求等等。通常情况下,这些操作需…...
【2023 年第二届钉钉杯大学生大数据挑战赛】 初赛 B:美国纽约公共自行车使用量预测分析 问题三时间序列预测Python代码分析
2023 年第二届钉钉杯大学生大数据挑战赛 初赛 B:美国纽约公共自行车使用量预测分析 问题三时间序列预测Python代码分析 相关链接 【2023 年第二届钉钉杯大学生大数据挑战赛】 初赛 B:美国纽约公共自行车使用量预测分析 问题一Python代码分析 【2023 年…...
redis-cluster 创建及监控
集群命令 cluster info:打印集群的信息。 cluster nodes:列出集群当前已知的所有节点(node)的相关信息。 cluster meet <ip> <port>:将ip和port所指定的节点添加到集群当中。 cluster addslots <slot…...
vue+ivew model框 select校验遇到的问题
iview model 点击关闭,校验没有通过也会关闭 解决办法: 第一步:自定义页脚内容 <div slot"footer"><Button type"primary" click"confirmCarryOver()">确认</Button><Button click&qu…...
mybatis_分页
目的: 减少数据处理量,提高效率 普通sql: 语法:select * from user limit startIndex,pageSize; SELECT * from user limit 3; #[0,n] mybatis_sql: 接口: //分页查询List<User> getUserByLimit(Map<…...
轻量级Firefox Send替代方案Gokapi
想不到一个域名的变动会影响这么大,访问量出现断崖式下跌。由此可见,平时的访问应该只是一些 RSS 的访问而已。 上面是 Pageviews,下面是 Uniques 今天略有回升 难怪那些大公司要花钱买域名了,不过老苏是个佛系的人,一…...
多次发请求优化为发一次请求
优化 getUserInfo 请求 要求 getUserInfo 是个通用接口,在各个模块里面都有可能使用 requestUserInfo 模拟的是请求服务端真正获取用户信息的方法 业务背景 在一个页面有 A, B, C 等多个功能模块,A, B, C 模块渲染执行顺序不可控每个模块都会调用 get…...
彻底搞懂CPU的特权等级
x86 处理器中,提供了4个特权级别:0,1,2,3。数字越小,特权级别越高! 一般来说,操作系统是的重要性、可靠性是最高的,需要运行在 0 特权级; 应用程序工作在最上层,来源广泛、可靠性最低,工作在 3 特权级别。 中间的1 和 2 两个特权级别,一般很少使用。 理论上来讲,…...
JVM对象在堆内存中是否如何分配?
1:指针碰撞:内存规整的情况下 2:空闲列表: 内存不规整的情况下 选择那种分配方式 是有 java堆是否规整而决定的。而java堆是否规整是否对应的垃圾回收器是否带有空间压缩整理的能力决定的。 因此当使用Serial,ParNew等带有压缩整理过程的收…...
【小白慎入】还在手动撸浏览器?教你一招分分钟自动化操作浏览器(Python进阶)
大家好啊,辣条哥又来猛货了! 小白慎入! 目录 环境安装1 测试样例2 基本配置2.0 基本参数2.1 设置窗口2.2 添加头部2.3 网页截图2.4 伪装浏览器 绕过检测2.5案例演示 触发JS2.6 boss直聘cookie反爬绕过实践2. 7滚动到页面底部 3 进阶使用4 数…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...
HTTPS证书一年多少钱?
HTTPS证书作为保障网站数据传输安全的重要工具,成为众多网站运营者的必备选择。然而,面对市场上种类繁多的HTTPS证书,其一年费用究竟是多少,又受哪些因素影响呢? 首先,HTTPS证书通常在PinTrust这样的专业平…...
StarRocks 全面向量化执行引擎深度解析
StarRocks 全面向量化执行引擎深度解析 StarRocks 的向量化执行引擎是其高性能的核心设计,相比传统行式处理引擎(如MySQL),性能可提升 5-10倍。以下是分层拆解: 1. 向量化 vs 传统行式处理 维度行式处理向量化处理数…...
解决MybatisPlus使用Druid1.2.11连接池查询PG数据库报Merge sql error的一种办法
目录 前言 一、问题重现 1、环境说明 2、重现步骤 3、错误信息 二、关于LATERAL 1、Lateral作用场景 2、在四至场景中使用 三、问题解决之道 1、源码追踪 2、关闭sql合并 3、改写处理SQL 四、总结 前言 在博客:【写在创作纪念日】基于SpringBoot和PostG…...
Linux实现线程同步的方式有哪些?
什么是线程同步? 想象一下超市收银台:如果所有顾客(线程)同时挤向同一个收银台(共享资源),场面会一片混乱。线程同步就是给顾客们发"排队号码牌",确保: 有序访…...
【自然语言处理】大模型时代的数据标注(主动学习)
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构D 实验设计E 个人总结 A 论文出处 论文题目:FreeAL: Towards Human-Free Active Learning in the Era of Large Language Models发表情况:2023-EMNLP作者单位:浙江大…...
