####[beego] http://beego.me/ go get github.com/astaxie/beego
###bee工具
#####1. 安装 go get github.com/beego/bee
#####2. 新建工程
在$GOPATH目录下,用命令行输入bee new [PROJECT_NAME]
,就会在$GOPATH/src
目录下新建一个工程。
#####3. 运行工程
进入创建好的工程根目录下,使用bee run [PROJECT_NAME]
,项目便会启动,此命令支持热编译。
###beego
#####1. Router package routers
import (
"beego.test/controllers"
"github.com/astaxie/beego"
)
func init() {
beego.Router("/", &controllers.MainController{}, "*:Get")
beego.Router("/user/:username:string", &controllers.UserController{}, "get:GetUser")
beego.Router("/user", &controllers.UserController{}, "post:AddUser")
}
注册路由的函数
Router(rootpath string, c ControllerInterface, mappingMethods ...string) *App
init
函数会在import之后被自动执行- 在这里是注册路由的步骤,采用REST的方式,将请求转发到Controller
rootpath
绑定的URL路径,以”/”为开头c
是个interface,指出要绑定的ControllermappingMethods
绑定控制器中的指定方法。格式为"HTTP_METHOD:FUNC_NAME"
。可以为空,为空时会默认绑定指定Controller中的Get、Post等方法(Get请求调用Get函数,一次类推)- 所有注册需要在
beego.Run()
之前进行
#####2. beego.Run() package main
import (
_ "beego.test/routers"
"github.com/astaxie/beego"
)
func main() {
beego.Run()
}
beego.Run()
会启动服务器,在此之前需要做路由监听。可以将所有需要注册路由的代码放到一起,一般放在[PROJECT]/routers/router.go
里面,通过_ "beego.test/routers"
初始化
-
解析配置文件
beego 会自动在 conf 目录下面去解析相应的配置文件 app.conf,这样就可以通过配置文件配置一些例如开启的端口,是否开启 session,应用名称等各种信息。
-
开启 session
会根据上面配置文件的分析之后判断是否开启 session,如果开启的话就初始化全局的 session。
-
编译模板
beego 会在启动的时候把 views 目录下的所有模板进行预编译,然后存在 map 里面,这样可以有效的提供模板运行的效率,无需进行多次编译。
-
启动管理模块
beego 目前做了一个很帅的模块,应用内监控模块,会在 8088 端口做一个内部监听,我们可以通过这个端口查询到 QPS、CPU、内存、GC、goroutine、thread 等各种信息。
-
监听服务端口
#####3. Controller + Golang中的继承
使用Controller的时候需要用到继承,使得每个新建的Controller都能有处理Request的能力,而不必重写一遍该功能。下面先介绍继承的实现。
type TestController struct {
beego.Controller
}
自定义的控制器都包含`beego.Controller`这个控制器,模拟继承。这是**匿名字段**。这里添加了`beego.Controller`这个struct,但是没有为其命名,在这种情况下,这个`struct(beego.Controller)`所拥有的全部字段都被隐式地引入了当前定义的这个`struct(TestController)`。这样就*继承到了父类所有的属性*了。
-
冲突和遮蔽
如果有两个字段具有相同的名字(可能是一个继承类型的名字),代码将遵循下面规则:
- 外层的名字遮蔽内层的名字。这提供了一个重写字段/方法的方式。
- 如果在同一层次上出现了相同的名字,如果名字被使用,那么将是一个错误。(如果没有使用,不会出现错误)
匿名字段冲突提供了一种重写的方法,如果没有冲突,使用父类的字段;如果冲突,使用子类的字段。
func (c *Controller) Get() { http.Error(c.Ctx.ResponseWriter, "Method Not Allowed", 405) }
在
beego/controllers.go
中已经实现了所有方法,例如Get、POST、PUT、DELETE,如果没有为新创建的Controller的GET方法添加Get()处理函数,beego会默认处理,返回405。
#####4. Model 系统中存在数据库访问处理操作,如果整个系统逻辑简单,可以直接在Controller中处理。如果系统比较复杂,有大量并且重复的数据库操作代码,可以抽象到Model层。
- Golang命名规范:采用驼峰命名。如果首字母大写,为public,如果为小写,只能被当前package访问到
-
beego会自动解析URL里面的Query,可以通过Controller的函数
GetInt, GetString
获得GetString(key string) string GetStrings(key string) []string GetInt(key string) (int64, error) GetBool(key string) (bool, error) GetFloat(key string) (float64, error)
#####5. View
+ 返回HTML。
View层需要用到的模板存放在[PROJECT]/views
目录下,支持.html
和.tpl
两种后缀名的文件。在 Controller 里面把数据赋值给了Data
(map 类型),在这里通过进行取值组装。
func (this *MainController) Get() {
this.Data["Website"] = "mnhkahn.github.io/kaleidoscope/2014/01/12/beego/"
this.Data["Email"] = "lichao0407@gmail.com"
this.TplNames = "index.tpl"
}
-
返回JSON
func (this *AddController) Get() { mystruct := { ... } this.Data["json"] = &mystruct this.ServeJson() } ###Golang语法及常见包 #####1. net/http
-
发送Get请求
resp, err := http.Get([URL]) + URL需要以`http://`开头
-
获取resp中的Body(byte[])
import "io/ioutil" reply, err := ioutil.ReadAll(resp.Body)
#####2. fmt + 类型转换
+ string转int
fmt.Sprintf("%d", (page-1)*size)
#####3. encoding/json + 解析json到struct
err = json.Unmarshal(reply, &solrBody)
type SolrBody struct {
ResponseHeader SolrResponseHeader `json:"responseHeader"`
SolrResponse SolrResponse `json:"response"`
}
#####4. Array & Slice + 声明
ids := []int{} + 增加值 append
ids = append(ids, value)
#####5. len The len built-in function returns the length of v, according to its type:
- Array: the number of elements in v.
- Pointer to array: the number of elements in
*v
(even if v is nil). - Slice, or map: the number of elements in v; if v is nil, len(v) is zero.
- String: the number of bytes in v.
- Channel: the number of elements queued (unread) in the channel buffer;
- if v is nil, len(v) is zero.
#####6. make & new 都可以用来申请内存,make返回对象,new返回指向对象的指针
原文链接:beego介绍,转载请注明来源!
有疑问加站长微信联系(非本文作者)