martini

Golang(go语言)的框架

て烟熏妆下的殇ゞ 提交于 2020-07-27 16:31:48
Golang(go语言)的框架 2020–07–25 框架名称 stars 描述 基于net/http的框架或基于fasthttp库 统计时间 gin 34686 Gin是一个用Go(Golang)编写的HTTP web框架。它提供了一个类似马提尼的API,性能更好,速度快了40倍 net/http 2020-01-13 beego 23023 beego可以用来快速开发API、Web、后端服务等各种应用,是一个RESTFul的框架,主要设计灵感来源于tornado、sinatra、flask这三个框架,但是结合了Go本身的一些特性(interface、struct继承等)而设计的一个框架 net/http 2020-01-13 iris 17287 最快的社区驱动的Go网络框架。Webassembly、带有公共域的自动HTTPS、MVC、会话、缓存、版本控制API、问题API、Websocket、依赖注入等等。与标准库和第三方中间件包完全兼容 2020-01-13 echo 16206 高性能、极简的Go-web框架 2020-01-13 kit 16018 微服务的标准库。 2020-01-13 revel 11518 一个用于Go语言的高生产率、全栈web框架 2020-01-13 go frame 1988 GoFrame是golang的一个模块化、功能齐全

route method becomes undefined in main package file

拈花ヽ惹草 提交于 2019-12-13 10:04:28
问题 My code is as shown below : app.go package main import ( "github.com/go-martini/martini" ) func main() { app := martini.Classic() app.Group("/books", func(r martini.Router) { r.Get("/:id", getBooks) r.Post("/new", newBook) r.Put("/update/:id", updateBook) r.Delete("/delete/:id", deleteBook) }) app.RunOnAddr(":8080") } main.go package main import "github.com/go-martini/martini" func getBooks() string { return "get books api called" } func newBook() string { return "Psot book api called" } func

Go Flush() doesn't work

試著忘記壹切 提交于 2019-12-08 11:55:57
问题 Please, check this gist and tell me, what's wrong? Why I don't see my messages? The gist: https://gist.github.com/cnaize/895f61b762a9f5ee074c If simple, I have two functions: func send(param martini.Params, r render.Render) { Ct.Msgs <- param["msg"] fmt.Printf("Sent: %v", param["msg"]) r.JSON(http.StatusOK, Response{"status": "ok"}) } And watch function: func watch(rw http.ResponseWriter, r render.Render) { var msg string ok := true for ok { select { case msg, ok = <-Ct.Msgs: rw.Write([]byte

Martini 极好的 Go WEB 框架

a 夏天 提交于 2019-12-05 03:30:18
已知的其他框架看到的是传统OOP的影子, 到处充蚀 Class 风格的 OOP 方法. 而我们知道GoLang中是没有Class的. 笔者也曾努力用Go 的风格做WEB开发, 总感到力不从心. 写出的代码不能完全称之为框架, 到更像一个拷贝源码使用的应用. 要达到灵活需要修改源码. 直到看到了 Martini . 纯 GoLang 风格的框架出现了. 核心Injector Injector 是 Martini 的核心. 其代码非常简洁. 功能仅仅是通过反射包, 对函数进行参数类型自动匹配进行调用. 笔者曾经为完成类似的功能写了 typeless , 这是一个繁琐的高成本的实验品. Injector 把事情简单化了, Injector 假设函数的参数都具有不同的类型. 在WEB开发中的 HandlerFunc 通常都具有这样的形式. 因此通过反射包可以对参数进行自动的匹配并调用HandlerFunc, 当然事先要把所有可能使用到的参数 Map/MapTo 给 Injector 对象, 这很容易而且是可以预见的. 简洁的路由设计 Martini的路由 router.go 写的非常简洁实用, 可见作者使用正则的功力非常深厚. 举例: "/wap/:category/pow/**/:id" 匹配: "/wap/Golang/pow/Path1/ToPathN/Foo" 灵活的中间件

golang: Martini之inject源码分析

旧城冷巷雨未停 提交于 2019-12-04 02:20:29
依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。在传统的程序设计过程中, 调用者是自己来决定使用哪些被调用者实现的。 但是在依赖注入模式中, 创建被调用者的工作不再由调用者来完成,因此称为控制反转; 创建被调用者实例的工作通常由注入器来完成,然后注入调用者,因此也称为依赖注入。 inject 是依赖注入的golang实现,作者是 codegangsta 。它能在运行时注入参数,调用方法。是Martini框架的基础核心。 我对依赖注入提取了以下2点性质: 由注入器注入属性。 由注入器创建被调用者实例。 在inject中,被调用者为func,因此注入属性也即对func注入实参(当然inject也可以注入struct,这样的话注入的属性就是struct中的已添加tag为`inject`的导出字段)。我们来看下普通的函数调用: package main import ( "fmt" ) func Say(name, gender string, age int) { fmt.Printf("My name is %s, gender is %s, age is %d!\n", name, gender, age) } func main() { Say("陈一回", "男", 20) } 上面的例子中

golang实现web中间件的一些思考

此生再无相见时 提交于 2019-12-04 02:20:07
最近陆续看了golang的Martini框架,也试用了,这个山寨自node.js的Express框架和最新的koa框架的golang框架, 同样具有低耦合的特点,不过还是担忧其性能,因为核心采用了reflect反射技术。 golang的http包用Hander、handerfuc这些来解决中间件的问题,比如说验证,日志等,采取的是一层层封装的方式, 好比洋葱。这样写出来的代码的缺点是耦合度高。如果中间件的顺序或者名字变换,则有很多代码需要改动。 为了降低依赖,则需让代码不要直接引用前一层的名称,加入第三方的一个间接层。reflect可行,但是reflect反射是基于对对象毫不了解,采取笨办法逐步找出对象类型(结构体)的各个函数的名称然后调用。 如果采取以下方法似乎可以更好解决这个问题: 每个待添加的组件都遵守一个简单的接口约定,比如将需要导出为外界调用的函数都保持在一个类似函数指针数组的数据结构中,这样,框架对于要启用的组件会知道如何去利用,有利于两者的协同。然后,若启用该组件,则可将这个数组和别的组件的数组放在一起,web应用依次调用。这种比较底层的方式,效率或者可以更高。 为进一步考虑提高效率,若组件运行时间比较长,可采用gorutine + channel 的方式,来达到各个中间件filter 模式并行执行的效果? golang的net