GIN框架(GOLANG)讲解如何疯速入门

news2024/12/23 0:47:30

1.初始化项目:


1.初始化项目:go mod init 

2.下载gin框架:go get -u github.com/gin-gonic/gin

3.引入:import "github.com/gin-gonic/gin"

注意点:

报错:$GOPATH/go.mod exists but should not
去掉goland编辑器里面的gopath文件(setting->GO):
手动设置(goland编辑器):setting-> Modules  GOPROXY=https://goproxy.cn

​示例:
//包名
package main
//引入包
import "github.com/gin-gonic/gin"
//主函数
func main() {
     //gin框架初始化
   r := gin.Default()
     //初始化GET请求并返回json格式数据(200表示状态码
   r.GET("/test", func(c *gin.Context) {
      c.JSON(200, gin.H{
         "message": "hello gin!",
      })
   })
   //运行(记住,run命令一定是在最后,后面的都不执行。默认监听8080端口)
   r.Run() //r.Run(":8080");修改参数可以修改监听端口
}
测试命令: go run 文件路径


2.RESTFUL:


    请求方式(前面讲到GET请求,http请求方法其实请求方式一共有8中,这8着重学习,RESTFUL风格接口和这一部分有紧密的练习,所以一定要研究透彻)

OPTIONS、HEAD、GET、POST、PUT、DELETE、TRACE、CONNECT

先讲一下常见的几个(掌握):
GET返回实体信息(相当于sql里面的select)
POST新增数据(相当于sql里面的insert)
PUT修改数据(相当于sql里面的update)
DELETE删除数据(相当于sql里面的delte)

不常见的几个(熟悉)
OPTIONS:用于获取目的资源所支持的通信选项,一般也是用于客户端查看服务器的性能
HEAD设置请求信息
    1.Accept:浏览器端能够处理的内容类型
    2.Accept-Encoding:请求端能够处理的的压缩编码
    3.Accept-Language:浏览器当前设置的语言
    4.Connection:浏览器与服务器的连接类型
    5.Host:发送请求的页面的域名
    6.Referer:发送请求的页面的URI
    7.User-Agent:浏览器的用户代理字符串
TRACE沿着目标资源的路径执行消息环回测试
CONNECT开启一个客户端与所请求资源之间的双向沟通的通道

来个例子尝尝(RESTful风格):
func index() {
    r := gin.Default()
    r.GET("/index", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "GET",
        })
    })

    r.POST("/index", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "POST",
        })
    })

    r.PUT("/index", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "PUT",
        })
    })

    r.DELETE("/index", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "DELETE",
        })
    })
}

3.模板渲染:


    (MVC模式:控制层相当于搞定了,视图层该怎么做嘞?那么接下来简介视图部分),视图怎么渲染?使用LoadHTMLGlob()或者LoadHTMLFiles()方法进行HTML模板渲染(相当于模板引擎,模板引擎是个啥?这里就不描述了,此外前端还需要自己摸索一下,要不然就很丑,看下面的示例图就知道,css样式也不描述了,要不然讲不完了,主要还是讲我们的函数的使用)

HTML页面:
<!DOCTYPE html>
<html>
<head>
    <title>测试页面(渲染页面)</title>
</head>
<body>
    <h1>我是渲染的页面</h1>
    <h1>{{.title}}</h1>
</body>

主方法:
注意:GET请求中c.HTML中第二个参数:描述html位置即模板位置的时候:注意放的是相对位置
详细解释一下:
    1.view/*:表示预加载view文件加下的所有文件
    2.文件夹下只有一层:view/* 或者 文件夹下有两层:view/**/*  依此类推
    3.c.HTML加载的2文件,在示例中相当于:view/index.html

func main() {
    r := gin.Default() //携带基础中间件启动
    //预载入view文件夹下的所有文件
    r.LoadHTMLGlob("../view/*") //注意相对位置(一定要注意)
    //初始化GET请求
    r.GET("/index", func(c *gin.Context) {
        //页面输出(注意:输出JSON和输出到页面方法已经有了改变,注意变化
        c.HTML(200,"index.html",gin.H{
            "title":"测试",
        })
    })
    r.Run() // listen and serve on 0.0.0.0:8080
}

4.自定义模板函数:

函数体:
func main() {
    r := gin.Default() //携带基础中间件启动
    r.SetFuncMap(template.FuncMap{
        "test": func(str string) template.HTML{
            return template.HTML(str)
        },
    })
    //预载入view文件夹下的所有文件(注意相对地址
    r.LoadHTMLFiles("../view/index.html")
    //r.LoadHTMLGlob("../view/*")
    //初始化GET请求
    r.GET("/index", func(c *gin.Context) {
        //页面输出(注意:输出JSON和输出到页面方法已经有了改变,注意变化)
        c.HTML(200,"index.html",gin.H{
            "title":"测试",
        })
    })
    r.Run() // listen and serve on 0.0.0.0:8080
}
 
HTML页面:
<!DOCTYPE html>
<html>
<head>
    <title>测试页面(渲染页面)</title>
</head>
<body>
    <h1>我是渲染的页面</h1>
    <h1>{{.title}}</h1>
    <h1>{{.|test}}</h1>
</body>
</html>


效果图:

5.渲染方式:


JSON渲染:c.JSON

XML渲染: c.XML

YAML渲染: c.YAML

PROTOBUF渲染:c.PROTOBUF

示例:只讲JSON渲染 和 XML渲染,其他的可以参考官网

JSON渲染(可以参考一下我前面的文章,需要用到结构体):

r.GET("/jsons", func(c *gin.Context) {
   type jsondata struct {
      title string
   }
   var  jsondatas jsondata
   jsondatas.title = "我是json标题"
   c.JSON(200,jsondatas)
})


XML渲染(可以参考一下我前面的文章,需要用到结构体):

r.GET("/xmls", func(c *gin.Context) {
   type jsondata struct {
      title string
   }
   var  jsondatas jsondata
   jsondatas.title = "我是json标题"
   c.XML(200,jsondatas)
})


6.参数获取(接收值):


1.获取URL上携带的参数:Query

例如:域名?name=123&weight=60

var name := c.Query("name")

var weight:= c.Query("weight")

2.获取URL上携带的参数:Param(区分于第一种,这个相当于有一个预处理)

r.GET("/index/:username/:weight", func(c *gin.Context) {
    username := c.Param("username")
    weight := c.Param("weight")
})

3.获取表单提交的参数:Postform

例如:接受一个form表单提交过来的数据(还是以name和weight为例)

var name := c.Postform("name")

var weight:= c.Postform("weight")

4.获取json参数:Unmarshal

例如:

b, _ := c.GetRawData()  // 从c.Request.Body读取请求数据
// 定义map或结构体(空接口类型)
var m map[string]interface{}
// 反序列化(将接收到的值反序列化后放入map集合,通过指针的方式实现)
_ = json.Unmarshal(b, &m)
c.JSON(http.StatusOK, m)

7.参数获取后应用(参数绑定):ShouldBind

     理解:通过映射的方式把接收到的参数放入结构体,不需要把参数一个一个放入结构了

例如:

//router.LoadHTMLFiles("../view/index.html")
router.LoadHTMLGlob("../view/*")
router.GET("/tests", func(c *gin.Context) {
    var login Login
    if err := c.ShouldBind(&login); err == nil {
        fmt.Printf("login info:%#v\n", login)
        c.HTML(200,"index.html",gin.H{
            "title":     login.User,
            "name": login.Password,
        })
    } else {
        c.JSON(400, gin.H{"error": err.Error()})
    }
})

8.文件上传

涉及函数:
Formfile():单文件 
MultipartForm()  :多文件 (需要轮询保存文件)
SaveUploadFile():保存文件


//单文件件上传
router.POST("/upload", func(c *gin.Context) {
    // 单个文件(判断上传的文件是否为空)
    file, err := c.FormFile("f1")
    if err != nil {
        c.JSON(500, gin.H{
            "message": err.Error(),
        })
        return
    }
    //文件上传路径
    dst := "文件存放地址"//示例:fmt.Sprintf("文件夹绝对路径", file.Filename)
    // 上传文件到指定的目录
    c.SaveUploadedFile(file, dst)
    //返回数据
    c.JSON(200, gin.H{
        "message": fmt.Sprintf("'%s' uploaded!", file.Filename),
    })
})


//多文件上传
router.POST("/uploadmult", func(c *gin.Context) {
    //获取多文件
    form, _ := c.MultipartForm()
    files := form.File["file"]
    //轮询上传
    for index, file := range files {
        log.Println(file.Filename)
        //文件上传路径
        dst := "文件存放地址"//示例:fmt.Sprintf("文件夹绝对路径", file.Filename,index)
        // 上传文件到指定的目录
        c.SaveUploadedFile(file, dst)
    }
    c.JSON(200, gin.H{
        "message": fmt.Sprintf("%d files uploaded!", len(files)),
    })
})

9.重定向

http重定向:Redirect(code,url)

路由重定向:

c.Request.URL.Path = "/test2"
r.HandleContext(c)

10.路由

       前面讲过RESTFUL风格的请求方式,那么通过前面的例子相比大家已经学习过了,简单的举个例子:

r.GET("/indexget", func(c *gin.Context) {...})
r.POST("/indexget", func(c *gin.Context) {...})

//这个路由方式是新的,这种方式可以接收到任何请求的方式
r.Any("/indexget", func(c *gin.Context) {...})

//这个路由方式是新的,这种路由的设置的作用:没有找到任何路由的请求会走到这个路由
r.NoRoute(func(c *gin.Context) {
    c.HTML(http.StatusNotFound, "views/404.html", nil)
})

那么问题来了,我们写项目,会有很多方法,每一个方法我们都要去写路由,这样太麻烦了,那么就诞生一个叫路由组的定西,那么详细讲一下啥叫路由组,直接上例子

func main() {
    //初始化框架
    router := gin.Default()
    //定义路由组
    userGroup := router.Group("/user")
    {
        userGroup.GET("/details", func(c *gin.Context) {...})
        userGroup.POST("/adduser", func(c *gin.Context) {...})

    }
    shopGroup := router.Group("/shop")
    {
        shopGroup.GET("/details", func(c *gin.Context) {...})
        shopGroup.POST("/addshop", func(c *gin.Context) {...})
    }
    router.Run()
}

11.中间件(这个特别重要,需要着重学习)

中间件类型:HandlerFunc

使用关键字:Use

中间件:中间件适合处理一些公共的业务逻辑,不用频繁的去重复写一个东西,可以理解成一个公共的类,处理大量公共的请求:路由—–> 中间件—–> 控制器

示例:

func middleW() gin.HandlerFunc {
    return func(c *gin.Context) {
        //todo
    }
}

func main()  {
    router := gin.Default()
    router.Use(middleW())
}

中间件的类别举例说明:

特殊方法:

c.Next()//调用剩余方法
c.Abort()//调过剩余方法
c.Set("","")//设置键值对(注意作用域范围)
c.Get("")//获取键值(注意作用域范围)
Return//终止执行当前中间件剩余内容,执行下一个中间件

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

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

相关文章

Python可视化分析项目

今天给大家分享一个基于python的django框架结合爬虫以及数据可视化和数据库的项目&#xff0c;该项目总体来说还是挺不错的&#xff0c;下面针对这个项目做具体介绍。 1&#xff1a;项目涉及技术&#xff1a; 项目后端语言&#xff1a;python 项目页面布局展现&#xff1a;前…

代码随想录算法训练营第四十二天|416. 分割等和子集

LeetCode416. 分割等和子集 背包问题&#xff0c;有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。背包问题有多种背包方式&#xff0c;常见…

地理探测器的应用方法

关于地理探测器的使用&#xff0c;网络上有大量的教学视频及资料&#xff0c;既可以用Excel计算&#xff0c;也可以利用R语言计算&#xff0c;本文主要分享利用Excel计算的方法&#xff0c;借鉴了大量的学习资料&#xff0c;记录一下供自己参考&#xff0c;也希望能帮到有需要的…

CLR via C#(一)CLR的执行模型

一、什么是CLR CLR全称Common Language Runtime&#xff0c;即公共语言运行时。它可以为所有面向CLR的语言提供运行时的内存管理、程序集加载、安全性、异常处理和线程同步等功能。 事实上&#xff0c;CLR并不关心开发者使用的到底是哪种语言&#xff0c;只要这门语言的编译器…

chatgpt赋能python:Python图像处理优化技巧:提高网站SEO效果的必修课程

Python图像处理优化技巧&#xff1a;提高网站SEO效果的必修课程 介绍 在当前数字化时代&#xff0c;网站的SEO优化已经成为了网站营销的重要一环。在优化网站SEO的同时&#xff0c;提升图像处理技巧也成为了重要的一环。Python作为当前最为火热的数据科学语言之一&#xff0c…

chatgpt赋能python:Python计算圆柱体积的方法

Python计算圆柱体积的方法 Python是一种广泛使用的编程语言&#xff0c;由于其易于学习和使用的特点&#xff0c;许多人在业余时间选择了学习Python。Python可以用来解决各种计算问题&#xff0c;其中包括计算圆柱体积。在本文中&#xff0c;我们将探讨如何使用Python计算圆柱…

chatgpt赋能python:Python在一个程序里调用另一段程序

Python在一个程序里调用另一段程序 随着Python程序的复杂度越来越高&#xff0c;有时候一个程序难以处理所有的任务。这时候我们可能需要将任务拆分成多个脚本来执行。但是&#xff0c;这会导致代码的复杂性增加&#xff0c;同时也会增加可读性和维护成本。这时候&#xff0c;…

LeetCode排序数组(常用排序一一实现)

912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 这道题他会设置一个数据量特别特别大的案例&#xff0c;对于一般的算法是一定过不去的 1.冒泡排序---这种的时间复杂度是O(n*n)&#xff0c;对于这道题是不可能过得去的 /*** Note: The returned array must be malloce…

EMQX将数据发送到后端

本文主要是记录了使用免费的EMQX的数据集成功能&#xff0c;将数据流转到后端平台。 在实现过程中&#xff0c;首先是在云服务器之中下载了EMQX&#xff0c;之后通过EMQX的数据集成功能&#xff0c;创建了数据桥接以及与之对应的规则&#xff0c;可以实现将EMQX接收到的数据转发…

C# | 二分查找算法的实现

C# | 二分查找算法的实现 文章目录 C# | 二分查找算法的实现前言示例代码算法思路测试结果结束语 前言 二分查找法一种在有序数组中查找目标值的算法。划重点——“有序”&#xff0c;与需要遍历整个数组的查询算法不同&#xff0c;二分查找法通过将数组分成两部分来快速定位目…

MATLAB-二维图形的绘制

本博文主要介绍绘图函数 Plot 函数的使用,图形的网格、坐标、标题、图例备注以及线型和颜色标记等。 一、Plot 指令 将数据绘制成曲线的函数是 Plot 指令, 该命令可以带有不同数目的参数。最简单的形式就是将数据传递给 Plot , 但是线条的类型和颜色和颜色…

Vue.js 比较重要知识点总结三

概述 Vue 中 nextTick 的实现原理v-if 和 v-show 的区别Vue 中的 key 有什么作用如何理解ref toRef和toRefsComposition API如何实现代码逻辑复用&#xff1f; Vue 中 nextTick 的实现原理 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法&#xf…

chatgpt赋能python:Python在线聊天:实现即时通讯的快速解决方案

Python在线聊天&#xff1a;实现即时通讯的快速解决方案 在当今数字时代&#xff0c;在线聊天已经成为人与人之间交流的主流方式。Python在线聊天应用程序提供了一种快速且可定制的解决方案&#xff0c;使个人用户和企业可以进行互联网通信。本文将向您介绍Python在线聊天的基…

软考A计划-电子商务设计师-电子商务系统建设

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

深挖MYSQL大表加索引

深挖MYSQL大表加索引 起因是这样的&#xff0c;有一张表存在慢sql&#xff0c;查询耗时最多达到12s&#xff0c;定位问题后发现是由于全表扫描导致&#xff0c;需要对字段增加索引&#xff0c;但是表的数据量600多万有些大&#xff0c;网上很多都说对大表增加索引可能会导致锁…

垂直行业(新站)SEO流量快速起飞的核心思路

现在做站不比以前了&#xff0c;不管你是做百度也好&#xff0c;还是谷歌也罢&#xff0c;对于行业精准SEO流量来说肯定是没有以前那么容易做了。但是不容易做不代表没有机会做&#xff0c;机会一直还是有的&#xff0c;尤其是最近百度打击泛站&#xff0c;对于垂直行业来说其实…

chatgpt赋能python:Python图片尺寸大小修改指南

Python图片尺寸大小修改指南 在现代网站设计中&#xff0c;图像是非常重要的一部分。图片质量和大小是网站排名和用户体验的关键因素。一般来说&#xff0c;网站应该尽量避免使用过多的大图片&#xff0c;因为它们会使用户等待过长的时间&#xff0c;同时也会降低网站的加载速…

JAVA基础练习(6)

目录 1.冒泡排列学员成绩(降序) 2.常用Arrays类的应用 2.1.sort 2.2.equals 2.3.toString 2.4.fill 2.5.Arrays.copyOf 2.6.binarySearch 3.利用二维数组计算成绩 1.冒泡排列学员成绩(降序) package ch06;import java.util.Arrays; import java.util…

代码随想录算法训练营第四十一天|343. 整数拆分|96.不同的二叉搜索树

LeetCode343. 整数拆分 动态规划五部曲&#xff1a; 1&#xff0c;确定dp数组&#xff08;dp table&#xff09;以及下标的含义&#xff1a;dp[i]&#xff1a;分拆数字i&#xff0c;可以得到的最大乘积为dp[i]。 2&#xff0c;确定递推公式&#xff1a;可以想 dp[i]最大乘积…

下载安装微软office的详细步骤

目录 一、前言 二、下载路径 &#xff08;一&#xff09;wps office 办公软件下载地址 1.wps office办公软件下载地址 &#xff08;二&#xff09;微软office 办公软件下载地址--2021 1.专业增强版 2.专业版 3.家庭专业版 4.家庭企业版 &#xff08;三&#xff09;…