好久没有更新过了,今年年底特别的忙,不知道为啥,太忙了简直,抽空出来赶紧更新一篇关于golang的文章,本次主将的是即Gin框架和Beego框架之后的有一个框架,叫 Echo框架
学习过PHP的同学肯定对这个词不陌生,在PHP中,这个是输出数据的一个函数,然而本次讲的Echo和PHP中echo没有半毛钱关系,这是一个Golang的框架,后面我们来仔细讲解一下Echo框架
1.项目初始化:
和前面几个框架一样,首先需要使用gorm命令初始化项目:go mod init 项目名称
2.安装echo框架:
命令:go get -u github.com/labstack/echo/v4
3.创建 Echo 项目:
创建并运行文件,看到如图所示案例则表示Echo框架已经安转并运行成功
4.创建路由:
func main() {
e := echo.New()
fmt.Println("测试数据")
e.GET("/index", func(c echo.Context) error {
return c.String(200, "Hello, World!")
})
// 启动服务器
e.Start(":8080")
}
输出结果:Hello, World!
5.自定义方法:
func main() {
e := echo.New()
fmt.Println("测试数据")
//定义GET方法
e.GET("/index", func(c echo.Context) error {
return c.String(200, "Hello, World!")
})
//定义POST方法
e.POST("/indexs",indexs)
// 启动服务器
e.Start(":8080")
}
//定义方法
func indexs(c echo.Context) error {
id := c.QueryParam("id")
return c.String(200, id)
}
6.定义资源路径:
在页面或者引入资源包的时候需要定义一个资源文件夹,里面存放JS,CSS,图片等一系列的静态资源,那么我们引用的时候需要使用相对路径或者绝对路径,那么我们就需要定义一个路径,来实现引用静态资源:比如 static 目录下的任何文件都会被访问。例如,一个访问 /static/js/main.js 的请求会匹配到 static/js/main.js 这个文件
e.Static("/static", "static")
7.数据绑定:Gin框架中我们介绍过了ShouldBind绑定,在Echo框架中就不能使用了,应该使用Bind来绑定数据到结构体:
//定义结构体 (注意:form 和 query 的值与url里面的值一定保持一致,否则接受不到参数)
type User struct {
Name string `json:"name" xml:"name" form:"name" query:"name"`
Sex string `json:"sex" xml:"sex" form:"sex" query:"sex"`
Age int `json:"age" xml:"age" form:"age" query:"age"`
}
//数据绑定
e.GET("/users:name:age", func(c echo.Context) error {
u := new(User)
c.Bind(u)
return c.JSON(200, u)
})
启动服务:go run main.go
访问地址:http://localhost:8080/users?name=测试姓名&sex=女&age=28
结果:
8.设置Cookie:
//设置cookie
func writeCookie(c echo.Context) error {
cookie := new(http.Cookie) //初始化对象
cookie.Name = "mykey" //设置key
cookie.Value = "jay" //设置value
cookie.Expires = time.Now().Add(24 * time.Hour) //设置过期时间
c.SetCookie(cookie)
return c.String(http.StatusOK, "write a cookie")
}
//获取cookie
func readCookie(c echo.Context) error {
cookie, err := c.Cookie("mykey")
if err != nil {
return err
}
return c.String(http.StatusOK, "read a cookie")
}
9.模板渲染:与前面的Gin框架和Beego框架不同,没有现成的方法, 所以需要自己定义
1.实现 echo.Renderer 接口
2.注册模版引擎
3.在控制器中渲染模版并返回 HTML 页面
//渲染函数定义
// 第一参数用于保存渲染模版后的结果
// 第二个参数是模版名字
// 第三个参数是传入模版的参数,可以是任意类型
// 第四个参数是echo.Context
Renderer interface {
Render(io.Writer, string, interface{}, Context) error
}
import (
"html/template"
"io"
"log"
"net/http"
"github.com/labstack/echo"
)
//自定义的模版引擎 struct
type TemplateRenderer struct {
templates *template.Template
}
// 实现接口,Render函数
func (t *TemplateRenderer) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
if viewContext, isMap := data.(map[string]interface{}); isMap {
viewContext["reverse"] = c.Echo().Reverse
}
return t.templates.ExecuteTemplate(w, name, data)
}
//主函数
func main() {
e := echo.New()
renderer := &TemplateRenderer{
templates: template.Must(template.ParseGlob("*.html")),
}
e.Renderer = renderer
e.GET("/user", func(c echo.Context) error {
return c.Render(http.StatusOK, "user.html", map[string]interface{}{
"name": "测试yonghu",
})
}).Name = "foobar"//路由重命名
log.Fatal(e.Start(":8000"))
}