导读
本套笔记是为了学习过其他语言框架,想要快速掌握gin框架推行的一套笔记。 虽然为了青训营而制作的一套笔记,但其他想要学go的程序员也可以通过这个上手go世界,后续会带你快速上手gorm,学完这两个之后,简体版抖音基本上就可以独立完成了,后续还会进行大项目的讲解开发,制作不易,喜欢的就点个关注吧。
注意
代码详解大部分是注释的形式给出,请留意代码注释。
Gin框架介绍
导读:Gin是一个非常受欢迎的Golang Web框架,它旨在提供高性能、易用和轻量级的解决方案。
入门小程序
接下来我将用一个简单的程序,带你快速上手一下gin框架。
package main import ( "github.com/gin-gonic/gin"//引入框架 "net/http" ) func main() { router := gin.Default()//设置路由 router.GET("/", func(c *gin.Context) { c.String(http.StatusOK, "Hello World") })//设置请求路径和响应信息 router.Run(":8000") //设置运行接口 }
当你把这段代码复制到goland上之后运行,然后打开浏览器输入8000端口,就会显示Hello World这个信息。
路由
在 Go 中,路由(Routing)是指将收到的 HTTP 请求映射到相应的处理程序或处理函数的过程。路由确定了请求的路径和方法,并将其分发给正确的处理程序来处理该请求。其实就是制造一个获取请求的大门。
GET()
使用get方式获得浏览器的请求,第一个参数设置请求路径,第二参数是一个函数接口,用来设置业务处理。 第二参数也就是自定义函数,所以也可以这样写
String()
第一个参数给浏览器一个ok响应,第二个参数是响应的String字符串。
package main import ( "github.com/gin-gonic/gin" //引入框架 "net/http" ) func a(c *gin.Context) { c.String(http.StatusOK, "Hello World") } //命名为a的函数 func main() { router := gin.Default() //设置路由 router.GET("/",a) //设置请求路径和响应信息 router.Run(":8000") //设置运行接口 }
run()
打开端口,如果不写的话默认是8080端口,可以自己设置。
状态码
http.StatusOK
就是一个状态码,http里面专门封装了各个状态码,知道常用的即可。
- 200 OK:请求成功。服务器成功返回请求的数据。 - 201 Created:请求已经被实现,且在服务器端创建了新的资源。 - 204 No Content:服务器成功处理了请求,但没有返回任何内容。 - 400 Bad Request:客户端发出的请求有错误,服务器无法理解。 - 401 Unauthorized:请求要求身份验证。客户端需要提供有效的身份验证凭据才能访问资源。 - 403 Forbidden:服务器拒绝访问请求的资源。 - 404 Not Found:服务器找不到请求的资源。 - 500 Internal Server Error:服务器内部错误,无法完成请求。
返回字符串
router.GET("/txt", func(c *gin.Context) { c.String(http.StatusOK, "看完点赞的你好帅啊") })
返回字符串是最简单的,不用多讲
返回json
什么是json
SON(JavaScript Object Notation)是一种轻量级的数据交换格式,具有易读性和易于编写的特点。它以键值对的形式组织数据,并使用简洁的文本表示。
JSON 使用类似于 JavaScript 对象字面量的语法:
{ "name": "Alice", "age": 25, "isStudent": true, "hobbies": ["reading", "painting", "hiking"], "address": { "street": "123 Main St", "city": "Exampleville", "country": "ABC" } }
对象(Object):由大括号 {}
包围,其中包含一组键值对。键是字符串,值可以是任意有效的 JSON 数据类型,包括对象、数组、字符串、数字、布尔值和 null。
这也就是我们最熟悉的
快速上手代码
package main import ( "github.com/gin-gonic/gin" //引入框架 "net/http" ) func a(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"Message": "返回成功", "status": "ok"}) } //设置json为返回格式,gin.h设置返回信息。格式与json格式一样。 func main() { router := gin.Default() //设置路由 router.GET("/", a) //设置请求路径和响应信息 router.Run() //设置运行接口 }
之后运行,我们用postman查看数据,响应成功
这个是直接响应,然而在真正的业务处理中我们往往是把一个结构体转化成json,这要怎么做呢?
结构体转json返回
package main import ( "github.com/gin-gonic/gin" //引入框架 "net/http" ) type Student struct { Name string `json:"user"` //名字 Age int //年龄 Gender int //性别,1为男,0为女 } //定义结构体 func a(c *gin.Context) { student := Student{"xiaoming", 18, 1} c.JSON(http.StatusOK, student) } func main() { router := gin.Default() //设置路由 router.GET("/json", a) //设置请求路径和响应信息 router.Run() //设置运行接口 }
请注意,结构体定义第一个字母必须大写,否则无法正常响应,运行之后使用postman接收
标签
json:"user"
就是标签,标签(Tag)是用来为字段提供附加的元数据,标签可以在运行时通过反射读取,常用于给结构体字段添加说明、配置、验证规则等。标签由一个或多个键值对组成,键和值用冒号分隔,多个键值对之间用空格分隔。
总而言之一个很高级的东西,我们暂时只需要了解 json:"user"
,后面的慢慢引入学习。
返回xml
XML(可扩展标记语言)是一种用于描述数据的标记语言。它类似于 HTML,但更加通用和灵活,适用于各种应用领域。
XML 使用标签来定义数据的结构和内容。每个 XML 文档都由元素(element)组成,其中包含标签、属性和文本数据。标签由尖括号 <
和 >
包围,例如 <person>
。标签可以嵌套,形成层次结构,子元素位于父元素的内部。
这些都是牵扯前端的知识了,我们只需要按照前端的要求返回就行。
package main import ( "github.com/gin-gonic/gin" //引入框架 "net/http" ) func a(c *gin.Context) { c.XML(http.StatusOK, gin.H{"user": "xiaoming", "message": "hey", "status": http.StatusOK}) } //与结构体类似 func main() { router := gin.Default() //设置路由 router.GET("/xml", a) //设置请求路径和响应信息 router.Run() //设置运行接口 }
使用postman接受响应
返回yaml
YAML(YAML Ain't Markup Language)是一种人类可读的数据序列化格式。它旨在成为一种比 XML 和 JSON 等更简洁和易于阅读的数据表示方式。
YAML 使用缩进、换行和特定的标点符号来表示数据结构,与其他格式相比,它更注重可读性和易用性。因此,YAML 文件可以更加直观地呈现复杂的数据结构和层次关系。
person: name: John age: 30 gender: male
我们也是按照要求返回即可
package main import ( "github.com/gin-gonic/gin" //引入框架 "net/http" ) func a(c *gin.Context) { c.YAML(http.StatusOK, gin.H{"user": "xiaoming", "message": "hey", "status": http.StatusOK}) } func main() { router := gin.Default() //设置路由 router.GET("/yaml", a) //设置请求路径和响应信息 router.Run() //设置运行接口 }
使用postman接受响应,如图所示
文件响应
文件响应(File Response)是指在Web开发中,服务器向客户端返回的一个文件作为响应的内容。当客户端发送请求后,服务器可以将一个文件作为响应内容发送给客户端,客户端可以选择保存、下载或直接展示该文件。
常见的文件响应类型包括但不限于以下几种:
- 下载文件:服务器将文件以附件形式返回给客户端,客户端可以选择将文件保存到本地或进行其他操作。
- 显示图片:服务器返回一个图片文件,客户端会将其显示在浏览器或其他应用程序中。
- 展示文档:服务器返回的文件为文档类型,如 PDF、Word 文档等,客户端可以选择在浏览器中进行展示或下载保存。
- 音视频播放:服务器返回的文件为音频或视频文件,客户端可以进行在线播放或下载保存。
在实现文件响应时,服务器通常会设置相应的 MIME 类型(Media Type)来告知客户端所返回的文件类型。这样客户端就能根据对应的 MIME 类型选择合适的方式处理文件。
返回一张照片
在golang中,没有相对文件的路径,它只有相对项目的路径
我们在项目中放一张图片
我们现在要做的的就是把这一张图片返回回去
package main import ( "github.com/gin-gonic/gin" //引入框架 "net/http" ) func main() { router := gin.Default() //设置路由 //第一个参数是静态路径,在这里项目里就是Gin, //第二个参数是Gin后面的静态路径,你要获得的文件 router.StaticFS("/Gin", http.Dir("/640.jpg")) router.Run() //设置运行接口 }
postman的响应结果如下
重定向
当客户端访问这个路径之后将会把他自动转到别的路径。
package main import ( "github.com/gin-gonic/gin" //引入框架 "net/http" ) func main() { router := gin.Default() //设置路由 router.GET("/redirect", func(c *gin.Context) { //支持内部和外部的重定向 c.Redirect(http.StatusMovedPermanently, "http://www.baidu.com/") }) router.Run() //设置运行接口 }
我们现在浏览器上进入http://localhost:8080/redirect 我们就会来到百度的网站。