go gin学习记录1
环境:
MAC M1,Go 1.17.2,GoLand
默认执行指令的终端,如果没有特别说明,指的都是goland->Terminal
创建项目
Goland中新建项目,在$GOPATH/src/目录下建立t_gin项目。
进入项目,在goland的Terminal终端下(默认pwd是项目所在目录)执行指令下载gin:
go get -u github.com/gin-gonic/gin
很快就会安装好。
然后在t_gin下建立一个新的go文件:main.go,用来作为项目的入口文件。
GET与POST请求参数处理
在main.go中开始编写代码,框架的话就先从接收参数开始。
package t_ginimport ("github.com/gin-gonic/gin""net/http"
)func main() {r := gin.Default()//Get 参数r.GET("/getTest", func(c *gin.Context) {name := c.Query("name")c.JSON(http.StatusOK, gin.H{"code": 0,"data": name,})})//Post 参数r.POST("/postTest", func(c *gin.Context) {name := c.PostForm("name")bankNoArr := c.PostFormArray("bankNo")var ret []stringfor _, bankNo := range bankNoArr {ret = append(ret, bankNo)}result := make(map[string]interface{})result["name"] = nameresult["bankNos"] = retc.JSON(http.StatusOK, gin.H{"code": 0,"data": result,})})r.Run()
}
好的,执行一下看看
$ go run main.go
package command-line-arguments is not a main package
没有运行成功,报了错误,这个错误提示比较浅显,是package的问题,执行应该是main包,我们调整一下代码如下部分:
package main
然后再运行看看
$ go run main.go
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.- using env: export GIN_MODE=release- using code: gin.SetMode(gin.ReleaseMode)[GIN-debug] GET /getTest --> main.main.func1 (3 handlers)
[GIN-debug] POST /postTest --> main.main.func2 (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080
好的,现在运行成功了,由于没有指定端口(在r.run()中可以指定端口),所以默认使用8080端口启动。
在测试代码里,我写了get和post两种请求方式的参数获取,这也是日常最常见的请求方式。
我们用postman对这两个接口做一下测试,看看参数获取是否正确。
先测试Get:
get请求的参数能够正确获取。
那我们再测试一下post:
很好,post请求参数也能够正常接收。
上传文件
在开发过程中,经常遇到的请求类型,除了Get和Post的接口请求,可能就是上传文件的请求了,当然,上传文件也属于Post请求的一种。
下面我们再来测试一下上传文件的基本实现,首先为了存放上传的文件,我们在t_gin目录下建立一个新的文件夹upload专门用来存放上传的文件。
测试上传文件的代码如下:
r.POST("/upload", func(c *gin.Context) {f, err := c.FormFile("uploadFile")if err != nil {panic(err.Error())}err = c.SaveUploadedFile(f, "./upload/"+f.Filename)if err != nil {panic(err.Error())}c.JSON(http.StatusOK, gin.H{"code": 0,"data": f.Filename,})})
还是用postman进行测试:
测试是成功的,那我们看看t_gin/upload/目录下是不是已经有了上传的文件呢?
已经有了对不对,符合我们的预期。
上传多个文件
上传文件的操作,有些时候可能会一次上传多个文件,那这种情况怎么处理呢?我们也来尝试一下这种场景。
测试多个文件上传的代码如下:
r.POST("/multiUpload", func(c *gin.Context) {multiForm, _ := c.MultipartForm()files := multiForm.File["uploadFile"]var result []stringfor _, file := range files {result = append(result, file.Filename)err := c.SaveUploadedFile(file, "./upload/"+file.Filename)if err != nil {log.Println("file save error:" + file.Filename)continue}}c.JSON(http.StatusOK, gin.H{"code": 0,"data": result,})})
同样的,我们还是将上传的文件放到./t_gin/upload/目录下,用postman测试一下看看:
好的,接口提示是上传成功了,我们再看一下upload目录下是不是已经有了上传的文件:
确实是有了,那多个文件上传的基本操作也成功了。
文件下载
既然说了文件上传,那就可能有文件下载,我们也来尝试一下文件下载的实现。
测试代码如下:
r.GET("/downloadFile", func(c *gin.Context) {//c.File("./upload/cat1.HEIC")c.FileAttachment("./upload/cat1.HEIC", "mycat.HEIC")})
浏览器试了一下,ok。
JSON参数处理
想想还有什么呢。。。。
对了,日常的请求中,使用最多的应该是json格式的参数,再尝试一下json格式的参数处理:
测试代码如下:
r.POST("/jsonTest", func(c *gin.Context) {type jsonParam struct {Name string `json:"name"`Age int `json:"age"`Sex string `json:"sex"`}var jsonP jsonParamerr := c.BindJSON(&jsonP)if err != nil {log.Panic(err.Error())}c.JSON(http.StatusOK, gin.H{"code": 0,"data": jsonP,})})
看代码可以发现,当参数是json形式时,是将json参数bind到了一个struct上。
有没有什么似曾相识的感觉??
对,就是java,和java的参数接收十分相像
ok,我们也用Postman测试一下看看:
好的,没什么问题。
路由分组
还有个不是参数相关的,属于路由范畴,算是路由分组,实际开发中总会遇到不同的模块,而模块内的接口前半部分大多情况下是相同的,这就属于路由分组了。
我们看下gin中怎么实现的,分组通常会有多个路由在一起,所以处理方法我们也集中起来放,这里我们在t_gin/目录下再建立一个controller文件夹,用来存放处理方法。
建好controller文件夹后,在其中新建learn.go代码文件,代码如下:
package controllerimport ("github.com/gin-gonic/gin""net/http"
)type LearnController struct {
}func (l *LearnController) First(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"code":0,"data":"this is first handle",})
}func (l *LearnController) Second(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"code":0,"data":"this is second handle",})
}
由于是做测试用,这里我在方法内部直接做了返回。
好的,现在处理方法有了,我们来处理路由分组,这部分是在main.go当中:
rg := r.Group("/learn"){learnCtrl := controller.LearnController{}rg.GET("/first", learnCtrl.First)rg.GET("/second", learnCtrl.Second)}
同样我们也测试一下,看看是否符合我们的预期
ok,没什么问题。
常用的基本就这些,还有其它的一些偶尔也会用到,有需要再去翻文档吧。
今天就到这里。
相关文章:
go gin学习记录1
环境: MAC M1,Go 1.17.2,GoLand 默认执行指令的终端,如果没有特别说明,指的都是goland->Terminal 创建项目 Goland中新建项目,在$GOPATH/src/目录下建立t_gin项目。 进入项目,在goland的T…...
Docker常用命令
1:帮助命令docker versiondocker infodocker --help2:镜像命令docker images(列出本地主机上的镜像)各个选项说明:docker imagesREPOSITORY:表示镜docker images像的仓库源TAG:镜像的标签IMAGE IDÿ…...
论文写作——公式编辑器、latex表格、颜色搭配器
1、公式编辑器(网页版mathtype可用于latex公式编辑): MathType demo - For DevelopersLive demonstration about the features of Mathtype which allows edition equations and formulas (PNG, flash, SVG, PDF, EPS), based on MathML and compatible with LaTeX.https:/…...
MySQL数据库12——视图(VIEW)
视图概念 视图是一个虚拟表,称其为虚拟表的原因是:视图内的数据并不属于视图本身,而属于创建视图时用到的基本表。可以认为,视图是一个表中的数据经过某种筛选后的显示方式;或者多个表中的数据经过连接筛选后的显示方…...
第四代英特尔至强重磅发布,芯片进入下半场:软硬加速、绿色可持续
编辑 | 宋慧 出品 | CSDN 云计算 2023 年的第二周,英特尔重磅发布其企业级芯片领域重要的产品——第四代英特尔 至强 可扩展处理器。作为数据中心处理器当之无愧的王牌产品,迄今为止,英特尔已经向全球客户交付了超8500万颗至强可扩展处理器…...
c++-运算符函数与运算符重载
目录概述例子注意问题概述 运算符重载是函数一个特殊情况,重载的运算符视为特殊的函数,称为运算符函数。 编译系统能依据使用运算符的不同环境,即参数(操作数)的数量或类型的差异,区分同一运算符的不同含义…...
【MySQL Shell】8.9.3 修复 InnoDB ClusterSet 中的成员服务器和集群
根据集群的问题或维护要求,可以使用以下操作来处理其成员服务器。除非另有说明,否则请使用使用 InnoDB Cluster 管理员帐户或服务器配置帐户获取的 Cluster 和 ClusterSet 对象,以便存储在 ClusterSet 对象中的默认用户帐户具有正确的权限。 …...
宝塔搭建实战php开源likeadmin通用管理pc端nuxt3源码(三)
大家好啊,我是测评君,欢迎来到web测评。 昨天给大家分享了admin前端的搭建部署方式,今天来给大家分享pc端在本地搭建,与打包发布到宝塔的方法,希望能够帮助到大家,感兴趣的朋友可以自行下载学习。 技术架构…...
【C++】---Stack和Queue的用法及其模拟实现
文章目录Stack最小栈栈的弹出压入序列逆波兰表达式求值用栈实现队列模拟实现queue用队列实现栈模拟实现Stack stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。它的使用和之前学习的ve…...
Python GUI编程
Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 和 Macintosh 系统里。Tk8…...
2023年浙江水利水电施工安全员精选真题题库及答案
百分百题库提供水利水电施工安全员考试试题、水利水电施工安全员考试预测题、水利水电施工安全员考试真题、水利水电施工安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 119.下列关于大模板按照的说法正确的是&#x…...
Solon2 开发之插件,三、插件体外扩展机制(E-Spi)
插件体外扩展机制,简称:E-Spi。用于解决 fatjar 模式部署时的扩展需求。比如: 把一些“业务模块”做成插件包放到体外把数据源配置文件放到体外,方便后续修改 其中, .properties 或 .yml 文件都会做为扩展配置加载&a…...
数据结构与算法(Java版) | 数据结构与算法的关系
从这一节起,咱们就要开始进入到「第二章——数据结构与算法的介绍」的学习中了,总的来说,第二章要讲解的内容其实也不是特别的多,内容也多偏理论,相信大家学起来是会比较轻松愉快的。 接下来,就请大家跟随…...
华科万维C++章节练习3_7
题目: 编程实现两种温度体系华氏温度和摄氏温度的相互转换; 以F作为华氏温度体系的单位,以C作为摄氏温度体系的单位。 要求当输入以F作为单位的温度值时(温度值范围[-500F~500F], 否则提示“数据输入有误!”)将其转换为对应的摄氏…...
CHAPTER 5 Jenkins SonarQube
Jenkins & SonarQube5.1 安装SonarQube1. 下载镜像2. 导出到其他服务器3. 准备工作4. docker-compose文件5. 启动容器5.2 登录SonarQube1.登录2. 安装中文语言插件3. 安装其他插件5.3 部署扫描器sonar-scanner1. 部署sonar-scanner2. 新建项目3. 扫描代码4. 查看报告5.4 Je…...
[AAAI 2023] Oral : Zero-shot 零样本/ Few-shot 少样本收录论文集合
零样本 (7篇): CALIP: Zero-Shot Enhancement of CLIP with Parameter-free AttentionGuo Ziyu; Zhang Renrui; Qiu Longtian; ma Xianzheng; Miao Xupeng; He Xuming; Cui BinMaximum Entropy Population-Based Training for Zero-Shot Human-AI CoordinationZhao …...
驱动开发 2.13
设备树 设备树就是一种描述硬件信息的树形结构,设备树上有很多设备节点,每一个设备节点都描述了一个硬件设备信息,设备节点中也可以再包含子设备节点和设备属性,同一个节点的不同属性是以链表结构存储,设备树有.dts设…...
【数据库】sql函数和多表关联查询
目录 一,SQL函数 1,聚合函数 1, count函数 2, AVG函数 3, SUM函数 4, MAX函数 5, MIN函数 6,数据分组——GROUP BY 7,限定组的结果,HAVING 8&#x…...
6-周赛332总结
6-周赛332总结 过了Q1和Q2,Q2知道用二分但是边界处理的不是很好,迷迷糊糊过的(手动再移动了下返回值…) Q3知道将子字符串的值取出来,将最短位置放在哈希表中,然后异或在哈希表中找值。但是我这个猪头脑袋…...
嵌入式Qt 开发一个音乐播放器
上篇文章:RK3568源码编译与交叉编译环境搭建,进行了OK3568开发板软件开发环境搭建,通过编译RK3568的源码,可以得到Qt开发的交叉编译相关工具。 本篇,就来在搭建好的软件开发中,进行Qt软件的开发测试。由于…...
2023秋招万得集团AI算法岗面经分享
本专栏分享 计算机小伙伴秋招春招找工作的面试经验和面试的详情知识点 专栏首页:秋招算法类面经分享 主要分享计算机算法类在面试互联网公司时候一些真实的经验 2022年 11.22下午AI算法岗面试 (1)一面35min 1、自我介绍 2、科研:长文本MRC...
RoI Transformer论文翻译详解
Learning RoI Transformer for Oriented Object Detection in Aerial Images 0.摘要 航空图像中的目标检测是计算机视觉中一个活跃而又具有挑战性的任务,因为它具有鸟瞰视角、高度复杂的背景和变化的物体外观。特别是在航空图像中检测密集的目标时,基于…...
Prometheus 自动发现监控AWS EC2实例
本文章简述对接自动发现AWS云EC2实例 前提环境: PromethuesGrafanaAWS IAM权限 涉及参考文档: AWS EC2Grafana 通用监控模板 一、IAM 用户创建 1、创建Prometheus 策略 策略规则: {"Version": "2012-10-17",&quo…...
从recat源码角度看setState流程
setState setState() 将对组件 state 的更改排入队列批量推迟更新,并通知 React 需要使用更新后的 state 重新渲染此组件及其子组件。其实setState实际上不是异步,只是代码执行顺序不同,有了异步的感觉。 使用方法 setState(stateChange | u…...
【Java|golang】1234. 替换子串得到平衡字符串---双指针
有一个只含有 ‘Q’, ‘W’, ‘E’, ‘R’ 四种字符,且长度为 n 的字符串。 假如在该字符串中,这四个字符都恰好出现 n/4 次,那么它就是一个「平衡字符串」。 给你一个这样的字符串 s,请通过「替换一个子串」的方式,…...
自监督表征学习方法——BYOL(Bootstrap Your Own Latent)
自监督表征学习方法——BYOL(Bootstrap Your Own Latent) 参考文献:《Bootstrap Your Own Latent A New Approach to Self-Supervised Learning》 1.前言背景 学习良好的图像表示是计算机视觉中的一个关键挑战,因为它允许对下游任务进行有效的训练。许…...
均衡负载集群(LBC)-1
均衡负载集群(LBC) 客户–>通过Internet—>负载调度器—>n台真实服务器 负载调度器: 软件:LVS;Nginx;Haproxy硬件:F5; LVS架构: 使用到C/S(B/S…...
WebSocket
关于WebSocket: WebSocket 协议在2008年诞生,2011年成为国际标准。现在所有浏览器都已经支持了。 WebSocket 的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话…...
GA-PEG-GA,Glutaric Acid-PEG-Glutaric Acid,戊二酸-聚乙二醇-戊二酸供应
英文名称:Glutaric Acid-PEG-Glutaric Acid,GA-PEG-GA 中文名称:戊二酸-聚乙二醇-戊二酸 GA-PEG-GA是一种线性双功能PEG羧酸试剂。PEG和羧基COOH之间存在C4酯键。PEG羧酸可用于与氨基反应,与NHS和DCC、EDC等肽偶联试剂反应。 P…...
使用sqlmap + burpsuite sql工具注入拿flag
使用sqlmap burpsuite sql工具注入拿flag 记录一下自己重新开始学习web安全之路③。 目标网站:http://mashang.eicp.vip:1651/7WOY59OBj74nTwKzs3aftsh1MDELK2cG/ 首先判断网站是否存在SQL注入漏洞 1.找交互点 发现只有url这一个交互点,搜索框和登录…...
php网站开发论坛/长沙seo网站优化
前言 坐标变换在机器人系统中十分重要,有关坐标变换,可参考ROS官方文档tf2。 广播静态坐标变换 静态坐标变换是指两坐标系之间的变换关系是固定的一种坐标变换,常用于表示汽车上两位置固定坐标系之间的变换关系,例如各个传感器…...
外贸独立网站制作/免费seo推广计划
或许你已经感受到了,大数据和人工智能正在对我们的生活产生影响。在朋友们留言中,不乏有人对未来表达了担忧。你是否对你自己所处的世界洞若观火?如果不是,那么就来听听吴军博士怎么说。计算机在解决各种智能问题上的进步幅度并不…...
西安市住房和城乡建设局门户网站/站长网站优化公司
实体类中包含对象属性从后台传回到前台表单,后台提示错误: at com.fasterxml.jackson.databind.ser.std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:183) at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsFiel…...
政府网站建设工作会/seo 知乎
本节书摘来自异步社区《软件测试技术大全:测试基础 流行工具 项目实战(第3版)》一书中的第1章,第1.3节软件测试行业的现状和前景,作者陈能技 , 黄志国,更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.3 软件测试行业的现…...
可以做ppt的网站有哪些方面/公司主页网站设计
你的得分:100.0完成日期:2014年05月23日17点13分说明:每道小题括号里的答案是您最高分那次所选的答案,标准答案将在本次作业结束(即2014年09月11日)后显示在题目旁边。一、单项选择题。本大题共50个小题,每小题2.0 分&…...
网站制作 公开课/广州营销型网站
序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。Python有6个序列的内置类型,但最常见的是列表和元组。序列都可以进行的操作包括索引&…...