Tiny Go Web (TGW)是一个非常简单的Web框架,甚至谈不上框架。TGW无意取代任何框架,TGW的诞生是因为作者在使用beego时有种挫败感,决定自己重新写一个适合自己网站用的(私人借书网,因为网站没有完成备案,暂时由托管在US的vps进行反向代理到ucloud主机,访问可能会有一定的延时),从构思到完成总共只花了一天时间,因为觉得它已经够用了,就没有继续添加新的功能。

项目地址:[](http://github.com/icattlecoder/tgw)http://github.com/icattlecoder/tgw

Qiuck Start

> go get github.com/icattlecoder/tgw
> cd src/github.com/icattlecoder/tgw/example
> go build
> ./example 

控制器

控制器实现自动路由注册,例如有以下的结构

type Server struct {
    //成员由业务逻辑而定,如mgo的数据库连接信息等
}

func NewServer( /*入参,例如从配置文件中读取*/) *Server {
    return &Server{}
}

//对应模板为index.html ,返回值data用于渲染模板
func (s *Server) Index() (data map[string]interface{}) {
    data = map[string]interface{}{}
    author := Author{
        Name:  "icattlecoder",
        Email: []string{"icattlecoder@gmail.com", "iwangming@hotmail.com"},
        QQ:    "405283013",
        Blog:  "http://blog.segmentfault.com/icattlecoder",
    }
    data["author"] = author
    return
}

//由于没有json.html模板,但是却有data返回值,此data将以json字符串的格式返回
func (s *Server) Json() (data map[string]interface{}) {
    data = map[string]interface{}{}
    author := Author{
        Name:  "icattlecoder",
        Email: []string{"icattlecoder@gmail.com", "iwangming@hotmail.com"},
        QQ:    "405283013",
        Blog:  "http://blog.segmentfault.com/icattlecoder",
    }
    data["author"] = author
    return
}

//这里根据请求自动解析出args
//例如可将 /hello?msg=hello world的函数解析为TestArgs{Msg:"hello world"}
//由于没有hello.html模板,并且没有返回值,可以通过env中的RW成员写入返回数据
func (s *Server) Hello(args TestArgs, env tgw.ReqEnv) {

    env.RW.Write([]byte(args.Msg))
    err = env.Session.Set("key", args)
    if err != nil {
        log.Println(err)
    }
}

func (s *Server) AdminIndex(){}

以下是程序启动代码

func main() {
    ser := controllers.NewServer()
    t:=tgw.NewTGW()
    log.Fatal(t.Register(&ser).Run(":8080"))
}

tgw的Register方法会自动注册以下的路由:

/hello       ===> func (s *Server) Hello(args TestArgs, env tgw.ReqEnv)
/index       ===> func (s *Server) Index() (data map[string]interface{}) 
/Json        ===> func (s *Server) Json() (data map[string]interface{})
/admin/index ===> func (s *Server) AdminIndex()

localhost:8080/index的处理函数是service.Index,localhost:8080/admin/index的处理函数是service.AdminIndex

视图

视图默认放在view文件夹中,其文件名与url有关,例如:/index对应 view/index.html
如果某个url没有对应的视图,但是它的处理函数却有返回值,那么将返回对象JOSN序列化的结果。
视图中可以通过<include src="<src>" />指令包含其它文件,如公共头区域。

参数解析

以下面的代码为例:

type TestArgs struct {
    Msg string
}
func (s *Server) Hello(args TestArgs, env tgw.ReqEnv)

对于请求localhost:8080/Hello?msg=Hello world,tgw将自动根据请求方法(POST或GET)识别并解析出TestArgs变量.
当前能够自动解析的类型有intstringboolfloat64

扩展参数解析

tgw自带*Args参数解析,即结构名符合*Args的参数都可以自动解析。如果需要定制解析,实现Parser接口即可

Session支持

框架实现了一个简单的session管理,基本满足一般的需求,如果需要使用session,处理函数必须有一个类型为tgw.ReqEnv的参数,通过此函数可访问Session。另外,Session的值由memcached存储,因此实际运行时需要一个memecached服务。

自定义输出

如果函数包含类型为tgw.ReqEnv参数,且无返回值,可以直接向ReqEnv.RW中写入返回结果。