25
2019
04

推荐一款go语言web框架--wego

地址:码云 

首先映入眼帘的是他的目录结构,看起来真的非常简洁,非常契合wego的设计理念。

根目录下每一个文件夹都是相互独立的,

core是框架核心包,要是你愿意,只用core都行。

  • cmd/ 一个实现命令行的小工具

  • config/ 用于读取配置文件的工具

  • core/ 框架的核心包,主要实现路由等。。。

  • demo/ 使用例子

  • fserve/ 用于实现框架支持访问静态文件功能的包

  • log/ log包,实现了日志输出到终端和文件,使用方法看demo

  • module/ 框架的模组

  • module/apidoc api文档

  • module/session session模组

  • module/template template模组,支持内存缓存,空间换时间,支持多语言

怎么使用wego框架?

先来看看他的demo

demo下有四个目录

    cmd  根目录cmd包的demo,严格来说,cmd根框架没有半毛钱关系。

    core 这就是即将要介绍的demo

    log   根目录log包的demo,这个日志库也是非常优秀的,去试试就知道了。为了契合设计理念,作者在core中都没有使用log包而是用的fmt,就是为了让开发者有更多选择余地。

    webproxy  这是一个代理小工具,为了弥补框架不支持多站点的缺陷而存在。


现在来看core的demo

根目录下的main.go是启动文件,就两行代码 apidoc.Run是开启api文档,线上就要把它删了,core.Run开启服务器

这个目录结构也很简单,一看就知道是传统的mvc,不要看到传统两字就意味着老旧与古板。

conf文件夹下是配置文件,实际开发时就在上面做一些更改就好了

controllers下是控制器,等会儿做介绍

crt是放证书的目录

init项目初始化的地方,他里面写了session和template的初始化以供参考

www可以认为是view目录,这个是可以在配置文件里配置的,下面有三个文件夹,lang是存放语言包的,已经写了cn中文和en英文例子,在下面的index.lang和模板目录下的index.html是对应关系,自动调用;static是静态文件存放目录,放比如说css、js和图片之类的文件;template下放的是模板文件

哈,目录是介绍完了,但感觉少了什么?没错,少的是model目录,这个就由开发者按实际自己发挥了。


现在来介绍一下controller,主要是看看路由是怎么写的,

首先一个控制器需要组合core基础Controller

type index struct {
	core.Controller // 继承基础Controller
}
// Prepare
func (inx *index) Prepare() {
	fmt.Println("Prepare运行成功")
}
// Finish
func (inx *index) Finish() {
	fmt.Println("Finish运行成功")
}
// Default 没有找到方法时执行
func (inx *index) Default() {
}
// APIupload 上传文件
func (inx *index) APIupload() {
}

控制器的Prepare和Finish方法在执行下面的业务逻辑方法的前后执行,这里有一点要注意的是finish和其他框架不同,finish和prepare是成对的,如果prepare被执行了,finish也一定会被执行。

控制器的default方法是在请求进入controller后没有找到相应的业务方法时执行

以大写的API开头的就是你的业务逻辑方法了,这个API可以在配置文件里配置

再来看看如何注册控制器

可以参考controllers下的init.go文件

ns := core.NewNameSpace( // 添加ns命名空间,对应路由/ns/
		"ns",
		core.NewNameSpace( // 添加get命名空间,对应路由/ns/get/
		    "get",
			core.NSaddController("test2", &test2{}), // 在get命名空间下添加控制器test2
		),		core.NewNameSpace( // /ns/action/
		"action",
			core.NewNameSpace( // /ns/action/save/				"save",
				core.NSaddController("test3", &test3{}), // /ns/action/save/test3/
			),
		),
core.NSaddController("test1", &test1{}), // /ns/test1/
core.NSaddController("index", &index{}), // /ns/index/
core.NSaddController("templatetest", &templatetest{}).SetStaticSpace(nil, setFuncStaticSpace), // /ns/templatetest/
core.NSaddController("session", &sessionTest{}), // /ns/session/
)
core.NSregister(ns) // 最后注册命名空间

core.NewNameSpace是添加命名空间,说白了就是如果你想构造 a/b/c/d这样的路径,你只需要嵌套abcd四个命名空间就行了
core.NSaddController是向命名空间添加控制器
core.NewNameSpace和core.NSaddController可以配合做出任何路由,强大吧。

最后用core.NSregister注册一下,路由就生效了。

哎呀,如果最后又发现有一个控制器忘记加进去了怎么办,可以用core.AddController("index", &index{}, "/a/b/c/")加进去,第一个参数是这个控制器在url中的名字,可以为空哦,至于是什么效果自己去实验吧,第三个参数是该控制器想要插队的路由。


SetStaticSpace( 控制器静态内存空间 , 业务方法静态内存空间 )

这个是框架创新的一个功能,可以为某一个控制器和方法绑定一个对象,是一个interface。这个对象会在访问那个控制器和方法时返回来,在core.Controller里去取,

有什么用处呢?非常强大,可以实现一些偏门的功能,因为偏门,所以我暂时想不到有什么突出的用法

但我能描述一些这个功能的原理,比如有一个index方法,先给他绑定一个int类型的count变量,当请求这个index方法时,可以得到你之前set的那个count变量,是完完全全的同一个,内存地址都不会变,然后你可以count++来记录index方法的访问次数。当然count必须传指针进去也就是&,而且使用时要注意并发问题。


至此教程完,感谢观赏

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。