第一天
gin是go编写的轻量级http web框架,运行速度非常快
gin最擅长的就是API接口的高并发,如果项目规模不大,业务相对简单,适合用gin
gin的官网:
热加载:go get github.com/pilu/fresh
package main
import "github.com/gin-gonic/gin"
func main() {
//创建一个默认的路由引擎
r := gin.Default()
//配置路由
r.GET("/", func(c *gin.Context) {
c.String(200, "值:%v","Hello, Gin!")
})//200也可以替换成http.StatusOK,那就需要引入net/http包
//启动路由
r.Run(":8080")//默认是8080,可以自定义为其他
}
gin路由中响应数据c.String(),c.JSON(),c.JSONP(),c.XML(),c.HTML()
c.String()
r.GET("/json1",func(c *gin.Context){
c.String(200,"值:%v","nihao")
})
c.JSON()
//创建json格式
r.GET("/json1",func(c *gin.Context){
c.JSON(200,map[string]interface{}{
"success":"true",
})
})
//可以直接用系统的gin.H,这个就是map[string]interface{}的别名
r.GET("/json2",func(c *gin.Context){
c.JSON(200,gin.H{
"success":"true",
})
})
//也可以返回结构体,a是一个实例化的结构体
//还可以`json:title"`来控制小写输出
r.GET("/json3",func(c *gin.Context){
a:=Article{
Title: "datastructure",
Author: "lxy",
}
c.JSON(200,a)
})
c.JSONP()主要用于跨域请求
http://localhost:8080/jsonp?callback=xxxx
在jsonp后面加上?callback=xxxx会输出
xxxx({"Title":"datastructure","Author":"lxy"});
//和json基本一样,不过可以有回调函数
r.GET("/jsonp",func(c *gin.Context){
a:=Article{
Title: "datastructure",
Author: "lxy",
}
c.JSONP(200,a)
})
c.XML()
只需要换成c.XML()即可
c.HTML()进行页面渲染
r := gin.Default()
//进行界面的加载,一定要紧紧挨着创建的语句
r.LoadHTMLGlob("templates/*")//加载templates里面所有的模板
r.GET("/news",func(c *gin.Context){
c.HTML(200,"news.html",gin.H{
"success":"true",
})
})
r.Run(":8080")
Gin HTML模板渲染
模板文件里面还有文件,一层文件多一个/**
r.LoadHTMLGlob("templates/*/")
可以在模板templates的html上面配置{{define "文件名/模板名"}}{{end}},相当于给模板起一个名称
然后在模板应用时,模板名为define后面这个名称
1、可以通过{{.}}输出数据
2、定义输出变量
定义:<h4>{{obj:=.title}}<h4>
输出:<br><h4>{{obj}}<h4><br>
3、比较函数
4、条件判断
<h2>{{.score}}</h2>
{{if gt .score 90}}
<p>优秀</p>
{{else if ge .score 80}}
<p>良好</p>
{{else}}
<p>及格</p>
{{end}}
5、range循环遍历
如果value里面是一个结构体,则需要$value.属性名来继续获取
<ul>
{{range $key,$value:=.score}}
<li>{{$key}}---{{$value}}</li>
{{else}}
<li>切片中没有数据</li>
{{end}}
</ul>
//
c.HTML(200,"news.html",gin.H{
"score":[]string{"eat","sleep","play"},
})
6、with来解构结构体
把news传进去之后用with解构之后,后面就不需要再加.news了
<br>
{{with .news}}
<p>{{.Title}}</p>
<p>{{.Author}}</p>
{{end}}
<br>
7、预定义函数
执行模板时,函数从两个函数字典查找:首先时模板函数字典,然后时全局函数字典。一般不在模板内定义函数,而是用Funcs方法添加函数到模板里
预定义函数的使用:{{len .success}}
8、自定义模板函数
自定义模板函数要放在加载模板上面,创建引擎下面
func UnixToTime(timestamp int)string{
t:=time.Unix(int64(timestamp),0)
return t.Format("2006-01-02 15:04:05")
}
r := gin.Default()
//自定义模板函数
r.SetFuncMap(template.FuncMap{
"UnixToTime":UnixToTime,
})
r.LoadHTMLGlob("templates/*")
//
{{UnixToTime .date}}
嵌套template
在一个模板应用另一个模板,在模板上面写上{{template "定义的另一个模板名字" .}},注意最后还有一个 .
可以嵌套多个模板
静态文件服务
配置静态web目录 第一个参数表示路由 第二个表示映射的目录
r.Static("/static","./static")