go gin学习记录1

news2024/11/16 2:36:09

环境:

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_gin

import (
	"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 []string

		for _, bankNo := range bankNoArr {
			ret = append(ret, bankNo)
		}

		result := make(map[string]interface{})
		result["name"] = name
		result["bankNos"] = ret

		c.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 []string

		for _, 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 jsonParam

		err := 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 controller

import (
	"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,没什么问题。

常用的基本就这些,还有其它的一些偶尔也会用到,有需要再去翻文档吧。
今天就到这里。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/342942.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spark04-文件读取分区数据分配原理

接 https://blog.csdn.net/oracle8090/article/details/129013345?spm1001.2014.3001.5502通过上一节知道 总字节数为7 每个分区字节数为3代码val conf: SparkConf new SparkConf().setMaster("local").setAppName("wordcount")val sc: SparkContext ne…

日日顺供应链|想要看清供应链发展趋势,先回答这三个问题

技术变革如何支撑供应链及管理服务的发展? 数字化与科技化开始承托供应链管理能力的升级与变革? 如何从客户需求的纬度反推供应链及管理服务的模式变革?在过去的三年中,我国的供应链企业经受了最为极端的挑战,但当下&a…

论文写作——公式编辑器、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:/…

C++之可调用对象、bind绑定器和function包装器

可调用对象在C中,可以像函数一样调用的有:普通函数、类的静态成员函数、仿函数、lambda函数、类的非静态成员函数、可被转换为函数的类的对象,统称可调用对象或函数对象。可调用对象有类型,可以用指针存储它们的地址,可…

孙子兵法-36计

目录 04、攻其无备,出其不意。——《孙子兵法始计篇》 08、不战而屈人之兵,善之善者也。——《孙子兵法谋攻篇》 09、上兵伐谋,其次伐交,其次伐兵,其下攻城。 01、兵者,国之大事,死生之地&…

想要的古风女生头像让你快速get

如今我看到很多人都喜欢用古风女生当作头像,那么今天我就来教大家如何快速得到一张超美的古风女生头像~ 上图就是我使用 APISpace 的 AI作画(图像生成)服务 快速生成的古风女生头像,不仅可以限定颜色,还可以选择『宝石镶嵌』或『花卉造型』这…

【HAL库】STM32CubeMX开发----STM32F407----Uart串口接收空闲中断

一、Uart串口接收空闲中断----详解 首先介绍串口通信的数据传输方式,这样后面的Uart串口空闲中断能更好的理解。 Uart串口通信----数据传输方式 串口通信的数据由发送设备通过自身的TXD接口传输到接收设备得RXD接口。 一个字符一个字符地传输,每个字符…

设计模式C++实现11:观察者模式

参考大话设计模式; 详细内容参见大话设计模式一书第十四章,该书使用C#实现,本实验通过C语言实现。 观察者模式又叫做发布-订阅(Publish/Subscribe)模式。 观察者模式定义了一种一对多的依赖关系,让多个观察…

Windows安装Gradle(IDEA兼容版)

IDEA兼容版本 IDEA安装目录下查看兼容Gradle版本:D:\win11\program\idea_2022.2.3\plugins\gradle\lib Gradle下载环境变量 1.创建仓库目录 D:\win11\program\gradle-7.4-bin\gradle-7.4\repository2.添加环境变量 GRADLE_HOME:D:\win11\program\gradle…

Java连接Redis

Jedis是Redis官方推荐的Java连接开发工具。api&#xff1a;https://tool.oschina.net/apidocs/apidoc?apijedis-2.1.0一、 导入包<!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency><groupId>redis.clients</groupId><…

在职阿里6年,一个29岁女软件测试工程师的心声

简单的先说一下&#xff0c;坐标杭州&#xff0c;14届本科毕业&#xff0c;算上年前在阿里巴巴的面试&#xff0c;一共有面试了有6家公司&#xff08;因为不想请假&#xff0c;因此只是每个晚上去其他公司面试&#xff0c;所以面试的公司比较少&#xff09;其中成功的有4家&…

新版bing(集成ChatGPT)的申请方法

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,科大讯飞比赛第三名,CCF比赛第四名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

redis知识汇总(部署、高可用、集群)

文章目录一、redis知识汇总什么是redisredis的优缺点&#xff1a;为什么要用redis做缓存redis为什么这么快什么是持久化redis持久化机制是什么&#xff1f;各自优缺点&#xff1f;AOF和RDB怎么选择redis持久化数据和缓存怎么做扩容什么是事务redis事务的概念ACID概念主从复制re…

03 OpenCV图像运算

文章目录1 普通加法1 加号相加2 add函数2 加权相加3 按位运算1 按位与运算2 按位或运算、非运算4 掩膜1 普通加法 1 加号相加 在 OpenCV 中&#xff0c;图像加法可以使用加号运算符&#xff08;&#xff09;来实现。例如&#xff0c;如果要将两幅图像相加&#xff0c;可以使用…

JVM - 类加载,连接和初始化

目录 类加载和类加载器 概述 类加载要完成的功能 加载类的方式 类加载器 类加载器的关系 类加载器说明 双亲委派模型 工作过程如下&#xff1a; 双亲委派模型说明&#xff1a; 破坏双亲委派模型&#xff1a; 类连接和初始化 类连接主要验证的内容 类连接中的解析…

c++重中之重:“换个龟壳继续套娃“:运算符重载等的学习

文章目录 前言一.运算符重载二.const成员三.取地址重载总结前言 上一期我们讲到类的6个默认构造函数中的拷贝构造函数&#xff0c;这一期我们继续往下讲&#xff0c;当然难点肯定是运算符重载了。 一、运算符重载 运算符重载是c为了增强代码的可读性引入了运算符重载&#xf…

笑死,面试官又问我SpringBoot自动配置原理

面试官&#xff1a;好久没见&#xff0c;甚是想念。今天来聊聊SpringBoot的自动配置吧&#xff1f; 候选者&#xff1a;嗯&#xff0c;SpringBoot的自动配置我觉得是SpringBoot很重要的“特性”了。众所周知&#xff0c;SpringBoot有着“约定大于配置”的理念&#xff0c;这一…

亿级高并发电商项目-- 实战篇 --万达商城项目 四(Dashboard服务、设置统一返回格式与异常处理、Postman测试接口 )

专栏&#xff1a;高并发---前后端分布式项目 &#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域新星创作者 &#x1f4d5;系列专栏&#xff1a;前端、Java、Java中间件大全、微信小程序、…

Spring-事务2

文章目录前言一、事务的特性&#xff08;ACID&#xff09;二、事务的隔离级别三、spring中的事务平台事务管理器.事务定义ISOLation_XXX&#xff1a;**事务隔离级别.**PROPAGATION_XXX&#xff1a;**事务的传播行为**.事务状态关系&#xff1a;四、使用XML文件配置事务1、 搭建…

2023前端面试题——JS篇

1.判断 js 类型的方式 1. typeof 可以判断出’string’,‘number’,‘boolean’,‘undefined’,‘symbol’ 但判断 typeof(null) 时值为 ‘object’; 判断数组和对象时值均为 ‘object’ 2. instanceof 原理是 构造函数的 prototype 属性是否出现在对象的原型链中的任何位置 …