21 January 2014

IMG-THUMBNAIL

关于golang语言和beego框架的使用的介绍。golang所有的设计都是围绕减少行数展开。

beego

https://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,指出要绑定的Controller
  • mappingMethods绑定控制器中的指定方法。格式为"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"] = "blog.cyeam.com/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 介绍,转载请注明来源!

EOF