Echo 是 Go 语言生态里的一个 web 应用框架, 这个框架提供了非常非常简单的方式来开发高性能的 Web 应用. 其实在写 Echo 之前, 还想说一说 Go 语言里一个非常有意思的东西, 叫 Reflect(反射) 的特性, 这个特性在动态语言中非常有用, 可以类比 Objective-C 中提供的 runtime 机制, 用来动态的执行 Method 或者设置属性, 而且 reflect 的使用非常的简单. reflect.TypeOf 和 reflect.ValueOf 来分别表示一个值的类型和一个类型的值, 并且通过这样的方式来动态的调用某些方法和设置属性.
- type NotknownType struct {
- s1, s2, s3 string
- }
- func (n NotknownType) String() string {
- return n.s1 + "-" + n.s2 + "-" + n.s3
- }
- func main(){
- var secret interface{} = NotknownType{"ada", "go", "obrer"}
- value := reflect.ValueOf(secret)
- fmt.Println(value)
- knd := value.Kind()
- fmt.Println(knd)
- for i := 0; i < value.NumField(); i++ {
- fmt.Println("Field %d: %vn", i, value.Field(i))
- }
- results := value.Method(0).Call(nil)
- fmt.Println(results)
- }
如果使用 ValueOf 那么可以用 Kind 方法来获取类型, 并且设置值用 Field, 调用方法用 Method, 这都非常的方便.
好了, 言归正传, 我们来看一看 Echo Web Framework, 这个用来开发 Web 应用的框架, 到底如何. 如果你接触过 Express 或者 Koa, 应该了解整套中间件的机制, 而 Echo Web Framework 正好也提供了这样的一套机制, 在形式上 (抛开语法不谈)Koa 的开发者能很顺利的切换到 Echo 上.
优化的 HTTP 路由.
创建可靠并可伸缩的 RESTful API.
行于标准的 HTTP 服务器或 FastHTTP 服务器.
组 APIs.
可扩展的 middleware 框架.
Define middleware at root, group or route level.
为 JSON, XML 进行数据绑定, 产生负荷.
提供便捷的方法来发送各种 HTTP 相应.
对 HTTP 错误进行集中处理.
Template rendering with any template engine.
定义属于你的日志格式.
高度个性化.
上述的 List 是通过官网文档翻译而来, 你可以看到 Echo Web Framework 提供了什么样的功能.
(准备好翻墙的工具), 使用 go get github/labstack/echo 命令来安装 echo 框架, 你可以在~/go/pkg/darwin_amd64/** 目录中查看到已经安装好的 echo, 这里的目录结构, 可能在不同的机器中不一样.(我的是 Mac)
- // main.go
- package main
- import (
- "net/http"
- "github.com/labstack/echo"
- "github.com/labstack/echo/engine/standard"
- )
- func main() {
- e := echo.New()
- e.GET("/", func(c echo.Context) error {
- return c.String(http.StatusOK, "Hello, World!")
- })
- e.Run(standard.New(":1323"))
- }
运行 go run main.go, 这是你就能通过 http://127.0.0.1:1323 来访问页面. 这是一个很简单的 Hello World 的例子, 但是从这个例子中, 可以很直观的感受到, 定义路由, 启动方法, 几乎都是类似的. 如果你用了 Koa, 其实也是这样来定义路由, 在 Echo 中也可以支持动态路由的配置, 如 e.GET("/i/:id", func( c echo.Context) error { // do }) , 至于其他的一些方式, 可能感觉比 Koa 封装的更方便, 如果你要获取 GET 的参数, 可以使用 c.QueryParam. 如果你要获取表单参数, 可以使用 c.FormValue. 如果你要获取 multipart/form-data 类型的数据 (一般文件上传), 可以使用 c.FormFile. 至于处理请求, 就更方便了, 直接在 struct 里使用 bind data 的特性来完成就好, 返回的类型, 也有很方便的方法给你使用, 如: c.JSON,c.XML 等. Context 机制, 几乎是所有 Web 框架的一大特点, 一个 Context 描述了一个请求的生命周期, 从 request 到 response 一个完整的链条, 很明显的出现在你的视野中. 几乎跟 HTTP 有关的内容, 都可以在 Context 中找到对于的方法来解析对于的内容.
Echo 也提供了和 Koa 一样的中间件流程, 几乎注册的方法都一样 (关于中间件概念, 如果不清楚, 那就要好好去看一下了).
- package main
- import (
- "fmt"
- "io"
- "os"
- "net/http"
- "github.com/labstack/echo"
- "github.com/labstack/echo/middleware"
- )
- func main() {
- e := echo.New()
- e.Use(middleware.Logger())
- e.Use(middleware.Recover())
- e.Static("/", "public")
- e.POST("/upload", upload)
- e.Logger.Fatal(e.Start(":1323"))
- }
这个例子是一个很简单的处理上传文件的服务, 提供了日志打印的功能, 使用. Use 来注册中间件. 剩下的, 很多都是业务开发了, 不过在此之外, 还有一些东西还需要完善, 毕竟做开发嘛, 能用工具解决的问题, 提升的效率, 尽量使用 shell ci 等方式来解决, 如: 开发阶段能每次编写完代码, 编辑器 save 的时候能自动重启, git push 时能自动重新部署等等, 这些对于整个开发的生命周期内效率的提升, 还是帮助蛮大的, 还有一个就是调试.
来源: https://www.thinksaas.cn/group/topic/839582/