1.Gin框架是什么?
Gin是一个golang编写的轻量级httpweb框架,运行速度快,擅长Api接口的高并发,修改或者完善某个接口的性能的时候,我们也可以使用极为流行的Gin框架
2.Gin环境搭建:
(1)首先要去GitHub上面下载常用的已经编写好的Gingrich框架
常用命令:
go get -u github.com/gin-gonic/gin
(2)然后在你的程序中导入这个包
常用命令:
import "github.com/gin-gonic/gin"
认识最简单的Gin框架路由:
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.GET("/sss", func(c *gin.Context) {
c.String(http.StatusOK, "这是一个简单的Gin程序")
})
r.Run(":8000")
}
首先要定义一个默认的路由
2.一共有四种路由常用类型
1.GET请求(从服务器中取出一种或多种资源)
2.POST请求(将数据或者资源存放在服务器中)
3.PUT请求(编辑服务器中的数据或者资源)
4.DELETE请求(删除服务器中的数据或者资源)
然后可以用包中的c.string或者c.XML或者c.HTML或者c.JSON或者c.JSONP等方法来输出各种信息,例如这样
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"html/template"
"net/http"
time2 "time"
)
func main() {
r := gin.Default()
r.SetFuncMap(template.FuncMap{
"unixtotime": unixtotime,
"println": println,
})
r.GET("/", func(c *gin.Context) {
c.String(200, "这是一个字符串类型")
})
r.GET("/jason1", func(c *gin.Context) {
c.JSON(200, map[string]interface{}{
"success": true,
"msg": "你好gin",
})
}) //是一个map【string】类的空接口,但是也可以使用gin.H代替
r.GET("/jason2", func(c *gin.Context) {
c.JSON(200, gin.H{
"success": true,
"msg": "你好gin",
"score": 89,
})
})//不同形式的空接口
r.GET("/jasonp", func(c *gin.Context) {
a := &Username{
des: "是一个男生",
name: "王科晨",
id: 2022,
}
c.JSONP(200, a)
}) //主要用来解决跨域问题,和前端相关
r.GET("/XML", func(c *gin.Context) {
c.XML(http.StatusOK, gin.H{
"success": true,
"msg": "你好gin",
})
})
r.GET("/HTML", func(c *gin.Context) {
c.HTML(http.StatusOK, "news.html", gin.H{
"title": "我是一个后台数据",
"score": 89,
"date": 1669466285,
"date2": 1662323721,
"msg": "sdsdsa",
})
})
r.Run(":8050")
}
要注意的一点区别是
c.JSON和c.JSONP的区别是:
本质区别不大,只不过JSONP多用来解决跨域问题,和前端相关
3.HTML里面的模板渲染
主体语句:
c.HTML(http.StatusOK,"default/index.html",map[string]interface{})
第一个参数是返回的状态码,这需要注意的一点是http.StatusOK和200是一样的,都是安全的意思,后面是你要渲染的HTML页面,最后是一个空接口,你可以在里面写一些自己的数据和属性,也可以引用你以前已经定义好的结构体类型,当然,也可以是字符串这些类型,这个空间很大,在Gin这个框架中,所有空接口都可以用gin.H来代替
我们如果想要进行HTML渲染需要注意的事项
1.我们要保证自己有一个已经编写好的HTML文件
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>注册页面</title>
</head>
<body>
<h4>单身🐕消失网站</h4>
<table width="500">
<!-- 第一行 -->
<tr>
<td>性别:</td>
<td>
<input type="radio" name="xingbie" id="nan"><label for="nan">男</label>
<input type="radio" name="xingbie" id="nv"><label for="nv">女</label>
</td>
</tr>
<!-- 第二行 -->
<tr>
<td>生日:</td>
<td>
<select>
<option>请选择年份</option>
<option>2000</option>
<option>2001</option>
<option>2002</option>
<option>2003</option>
</select>
<select>
<option>请选择月份</option>
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
<option>6</option>
<option>7</option>
<option>8</option>
<option>9</option>
<option>10</option>
<option>11</option>
<option>12</option>
</select>
<select>
<option>请选择日期</option>
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
<option>6</option>
<option>7</option>
<option>8</option>
<option>9</option>
<option>10</option>
<option>11</option>
<option>12</option>
<option>13</option>
<option>14</option>
<option>15</option>
<option>16</option>
<option>17</option>
<option>18</option>
<option>19</option>
<option>20</option>
<option>21</option>
<option>22</option>
<option>23</option>
<option>24</option>
<option>25</option>
<option>26</option>
<option>27</option>
<option>28</option>
<option>29</option>
<option>30</option>
<option>31</option>
</select>
</td>
</tr>
<!-- 第三行 -->
<tr>
<td>住宅地址</td>
<td><input type="text" value="请输入地址"></td>
</tr>
<!-- 第四行 -->
<tr>
<td>婚姻状况:</td>
<td>
<input type="radio" name="marry" id="yihun"><label for="yihun">已婚</label>
<input type="radio" name="marry" id="weihun" checked="checked"><label for="weihun">未婚</label>
<input type="radio" name="marry" id="lihun"><label for="lihun">离婚</label>
</td>
</tr>
<!-- 第五行 -->
<tr>
<td>学历</td>
<td><input type="text" value="输入你现在的学历"></td>
</tr>
<!-- 第六行 -->
<tr>
<td>喜欢的类型</td>
<td>
<input type="checkbox" name="love">萝莉
<input type="checkbox" name="love">御姐
<input type="checkbox" name="love">帅气
<input type="checkbox" name="love">老实
<input type="checkbox" name="love">淳朴
<input type="checkbox" name="love">暖男
</td>
</tr>
<!-- 第七行 -->
<tr>
<td>个人介绍</td>
<td><textarea></textarea></td>
</tr>
<!-- 第八行 -->
<tr>
<td></td>
<td>
<input type="submit" value="注册">
</td>
</tr>
<!-- 第九行 -->
<tr>
<td></td>
<td>
<input type="checkbox" checked="checked">我同意注册条款和会员加入标准
</td>
</tr>
<!-- 第十行 -->
<tr>
<td></td>
<td>
<h5>我承诺</h5>
<ul>
<li>我年满18岁</li>
<li>我现在单身</li>
<li>认真寻找另一半</li>
</ul>
</td>
</tr>
</table>
</textarea>
</body>
</html>
2.然后就是很关键的一步,我们需要在设置默认路由之后,进行一个`
r.LoadHTMLGlob("temples/*")或者r.LoadHTMLFiles("temples/*")都可以
不过需要注意的是,这个第一个参数是你的HTML所在文件夹,第二个参数是你的文件层数,如果直接在第一层目录下面,那么就是/*,如果多了一层目录,那么就需要多加一个/**
这样就可以完美使用你的HTML模板渲染了
4.如何处理在不同目录下面的HTML模板
可以对你的文件进行一种特殊的的”起名字“
{{ define "admin/index.html" }}
{{end}}
将你的代码用这两个东西包裹,这样你在使用的时候就会分辨的更加清晰一些,从而不会出现两个目录里有重复的模板而编译器不知道渲染谁的情况
Gin模板的基本语法
(前提):所有的你写的类似于代码的东西都要用{{}}包裹,不管是什么东西
1.".”的用法
这个点可以用来代表你渲染的数据等等,还可以表示你对结构体内的东西的引用
2.注释的写法
{{/*注释 */}}
3.变量的声明
{{¥t := .数据}}
首先,变量都是要美元符号的,其次,声明语法和在编写后台程序是一样的
4、比较函数
布尔函数会将任何类型的零值视为假,其余视为真。
下面是定义为函数的二元比较运算的集合:
eq 如果 arg1 == arg2 则返回真
ne 如果 arg1 != arg2 则返回真
lt 如果 arg1 < arg2 则返回真
le 如果 arg1 <= arg2 则返回真
gt 如果 arg1 > arg2 则返回真
ge 如果 arg1 >= arg2 则返回真
5.条件判断的使用
{{if 条件符号 第一个变量 第二个变量}}
看起来好像有点奇怪,其实就是有点奇怪,写习惯了就好
ps:在最后一个else后面要跟一个{{end}}
这是个不成文的规定
6.range
Go 的模板语法中使用 range 关键字进行遍历,有以下两种写法,其中 pipeline 的值必须是数
组、切片、字典或者通道。
{{range $key,$value := .obj}}
{{$value}}
{{end}}
{{$key,$value := .obj}}
{{$value}}
{{else}}
pipeline 的值其长度为 0
{{end}}
router.GET("/", func(c *gin.Context) {
c.HTML(http.StatusOK, "default/index.html", map[string]interface{}{ "hobby": []string{"吃饭", "睡觉", "写代码"}, })
})
{{range $key,$value := .hobby}}
<p>{{$value}}</p>
{{end}}
7.with
user := UserInfo{
Name: "张三", Gender: "男", Age: 18, }
router.GET("/", func(c *gin.Context) {
c.HTML(http.StatusOK, "default/index.html", map[string]interface{}{ "user": user, })
})
{{with .user}}
<h4>姓名:{{.Name}}</h4>
<h4>性别:{{.user.Gender}}</h4>
<h4>年龄:{{.Age}}</h4>
{{end}}
这样子就会方便很多
4预定义模板函数
在goland自己写的预定义模板函数里面(其实就是类似于各种包下的内置函数)
比如len 或者 index这些,以后使用的时候,只需要查看一下,查阅一下文档
5.与之对应的自定义模板函数
1.要先写好函数内容本体:
func unixtotime(date int) string {
time := time2.Unix(int64(date), 0)
return time.Format("2006-01-02 15:04:05")
}
func println(str1 string, str2 string) string {
fmt.Println(str1, str2)
return str1 + "----" + str2
2.然后在定义好默认的路由以后
r.SetFuncMap(template.FuncMap{
"unixtotime": unixtotime,
"println": println,
})
//这句话要放在加载模板的上面
这句代码非常关键,只有写出来才能正常使用自定义的函数模板,不然是没法使用的
如果想渲染你的HTML页面,那么你需要在一个HTML页面中使用
{{template “目录名/文件名” .}}
最后这个点不要忘记
静态文件的引入
当我们渲染的 HTML 文件中引用了静态文件时,我们需要配置静态 web 服务
r.Static(“/static”, “./static”) 前面的/static 表示路由 后面的./static 表示路径
func main() {
r := gin.Default()
r.Static("/static", "./static")
r.LoadHTMLGlob("templates/**/*")
// ... r.Run(":8080")
}
<link rel="stylesheet" href="/static/css/base.css" />
在一个HTML文件中使用最后一句,前面的参数是固定的,后面的参数随着你的文件而变化