(本文为转载,原文:Beego学习笔记——开始)

beego简介

beego是一个快速开发Go应用的http框架,他可以用来快速开发API、Web、后端服务等各种应用,是一个RESTFul的框架,主要设计灵感来源于tornado、sinatra、flask这三个框架,但是结合了Go本身的一些特性(interface、struct继承等)而设计的一个框架。

beego的架构

beego的整体设计架构如下所示:

beego是基于八大独立的模块之上构建的,是一个高度解耦的框架。当初设计beego的时候就是考虑功能模块化,用户即使不适用beego的http逻辑,也是可以在使用这些独立模块,例如你可以使用cache模块来做你的缓存逻辑,使用日志模块来记录你的操作信息,使用config模块来解析你各种格式的文件,所以不仅仅在beego开发中,你的socket游戏开发中也是很有用的模块,这也是beego为什么受欢迎的一个原因。大家如果玩过乐高的话,应该知道很多高级的东西都是一块一块的积木搭建出来的,而设计beego的时候,这些模块就是积木,高级机器人就是beego。至于这些模块的功能以及如何使用会在后面的文档会逐一介绍。

beego的执行逻辑

既然beego是基于这些模块构建的,那么他的执行逻辑是怎么样的呢?beego是一个典型的MVC架构,他的执行逻辑如下图所示:

beego项目结构

一般的beego项目的目录如下所示:

├── conf
│ └── app.conf
├── controllers
│ ├── admin
│ └── default.go
├── main.go
├── models
│ └── models.go
├── static
│ ├── css
│ ├── ico
│ ├── img
│ └── js
└── views
├── admin
└── index.tpl

从上面的目录结构我们可以看出来M(models目录)、V(views目录)、C(controllers目录)的结构,main.go是入口文件。

以上是Beego官方文档对其的介绍,及其的组成部分。在后面的学习过程中,我会把8个基础模块拆开,撇开MVC,一部分一部分的学习。

        下面首先建立一个简单的命令式的测试入口程序,方便以后学习时输出。
        
        对于Beego的安装这里就不多说了,百度一下,可以找到很多相关技术博客,官方文档也有很详细的介绍。
        环境介绍:
                IDE:IntelliJ IDEA
                运行系统:Mac OS
        后面没有特殊说明的话,都是以此为背景。
 
1、新建工程
如下图,IDEA->File->Project

选择Go->点击Next
选择Go版本->Next
选择工程路径,给自己的工程命名,这里就简单命名为beegotest吧,然后点击Finish

下面就是我们创建的目录结构,是个空项目

然后在根目录下创建个main.go文件,作为我们的入口文件。再简单输出一句”beego test"测试下
package main

import "fmt"

func main() {
fmt.Println("beego test")
}
点击编辑器的左下角Terminal标记,会显示出一个终端窗口,且目录已切换到当前目录,接下来我们就可以在这里命令执行我们的代码了。

在终端输入命令:go run main.go  回车执行,如下图,已经输出了我们代码中的beego test

我们程序的命令格式为 cmd params,命令和参数用空格隔开,下面写个简单的help函数
func Help(args []string)int{
fmt.Println(`Command:
help(h)
`)
return
}
但是怎么让这个函数在我们输入help,或者h命令的时候就去执行这个方法呢?这个时候需要做两个步骤,第一,就是需要输入命令的地方,第二就是把命令转为调用我们的函数。我们在main函数中增加命令输入的功能.
func main() {
r := bufio.NewReader(os.Stdin) fmt.Print("Command> ")
b, _, _ := r.ReadLine()
line := string(b)
tokens := strings.Split(line, " ")
fmt.Println(tokens)
}

运行的结果如下图,其中红色框内是自己手输的内容。

接下来就是第二步了,如何通过我们输入的内容去调用相关的函数,下面我们将新增个GetCommandHandlers函数,如下:
func GetCommandHandlers() map[string]func(args []string) int {
return map[string]func([]string) int{
"help": Help,
"h": Help,
}
}
这个函数会返回一个map,其中key为我们定义的命令,value为我们为这个命令定义的函数,且此函数的定义必须是参数为[]string, 且返回类型为int,返回为非0得数字则退出程序,为0则继续。若以后增加了其他命令,在此函数中增加映射就可以了。下面我们继续改造main函数,使其调用此函数:
func main() {
r := bufio.NewReader(os.Stdin)
handlers := GetCommandHandlers()
Help(nil) for {
fmt.Print("Command> ")
b, _, _ := r.ReadLine()
line := string(b)
tokens := strings.Split(line, " ") if handler, ok := handlers[tokens[]]; ok{
ret := handler(tokens)
if ret != {
break
}
}else {
fmt.Println("Unknown Command:", tokens[])
}
}
}

运行结果如下:

下面我们在增加一个退出命令。完整的代码如下:
package main

import (
"bufio"
"fmt"
"os"
"strings"
) func main() {
r := bufio.NewReader(os.Stdin)
handlers := GetCommandHandlers()
Help(nil) for {
fmt.Print("Command> ")
b, _, _ := r.ReadLine()
line := string(b)
tokens := strings.Split(line, " ") if handler, ok := handlers[tokens[]]; ok{
ret := handler(tokens)
if ret != {
break
}
}else {
fmt.Println("Unknown Command:", tokens[])
}
}
} func GetCommandHandlers() map[string]func(args []string) int {
return map[string]func([]string) int{
"help": Help,
"h": Help,
"quit" : Quit,
"q":Quit,
}
} func Help(args []string) int {
fmt.Println(`Command:
help(h)
quit(q)
`)
return
} func Quit(args []string) int{
return
}

运行结果如下:

 
 
 
 
        

Beego学习笔记——开始的更多相关文章

  1. Beego学习笔记——Logs

    日志处理 这是一个用来处理日志的库,它的设计思路来自于database/sql,目前支持的引擎有file.console.net.smtp,可以通过如下方式进行安装: go get github.co ...

  2. Beego学习笔记——Config

    配置文件解析 这是一个用来解析文件的库,它的设计思路来自于database/sql,目前支持解析的文件格式有ini.json.xml.yaml,可以通过如下方式进行安装: go get github. ...

  3. Beego学习笔记

    Beego学习笔记 Go 路由(Controller) 路由就是根据用户的请求找到需要执行的函数或者controller. Get /v1/shop/nike ShopController Get D ...

  4. Beego 学习笔记15:布局页面

    页面布局 1>     一个html页面由:head部分,body部分,内部css,内部js,外联css,外联的js这几部分组成.因此,一个布局文件也就需要针对这些进行拆分. 2>     ...

  5. Beego 学习笔记14:Session控制

    Session控制 1>     Session常用来作为全局变量使用,比如记录当前登录的用户,或者页面之间传递数据使用. 2>     Beego框架内置了 session 模块,目前 ...

  6. beego学习笔记(4):开发文档阅读(6)

    beego的响应流程: 1.监听的端口接收数据,默认是8080端口. 2.用户请求到达8080端口后,开始数据处理流程. 3.初始化CONTEXT对象.判断是否是WEBSOCKET请求,如果是,设置I ...

  7. beego学习笔记(4):开发文档阅读(5)

    controller的逻辑: 我们看下面的代码,就知道怎么传值的: import ( "github.com/astaxie/beego" ) type MainControlle ...

  8. beego学习笔记(4):开发文档阅读(4)

    beego.Run() 这个运行后, 1)解析配置文件,也就是conf目录下的. 2)判断是否开启session,并作相应的工作 3)执行用户的hookfunc. 4)是否编译模板 5)是否开启文档功 ...

  9. beego学习笔记(4):开发文档阅读(3)

    通过运行 bee new quickstart 来创建新的项目,其结构如下: quickstart |-- conf | `-- app.conf |-- controllers | `-- defa ...

随机推荐

  1. logistic回归 c++ 实现

    logistic回归是统计学习中经典的分类方法,他属于对数线性模型.本博文主要给出logistic的c++实现,具体理论请读者自行google. 本文用到的数据集来自于一个医学网站,具体出处不记得了( ...

  2. 列表类型转换(ConvertList<TSource, TResult>)

    性能优化-列表类型转换(ConvertList<TSource, TResult>) 2013-12-16 16:55 by stevey, 426 阅读, 7 评论, 收藏, 编辑 之前 ...

  3. C#自定义配置文件节点

    老实说,在以前没写个自定义配置节点之前,我都是写到一个很常用的节点里面,就是appSettings里add,然后再对各个节点的value值进行字符串分割操作,根据各种分割字符嵌套循环处理,后来看到一些 ...

  4. android Fragment 用法小结

    Fragment 是android 3.0引入的新API,是作为Activity的子模块,必须嵌入Activity才能使用. Activity 与 Fragment的关系: 一.依附性: 1. Fra ...

  5. [转]Jailbreak Detection Methods

    Source: http://blog.spiderlabs.com/2014/10/jailbreak-detection-methods.html Many iOS applications co ...

  6. vim复制

    关于vim复制剪贴粘贴命令的总结   最近在使用vim,感觉很好很强大,但是在使用复制剪切粘贴命令是,碰到了一些小困惑,网上找了一些资料感觉很不全,讲的也不好,遂自己进行实践并总结了. 首先是剪切(删 ...

  7. addEventListener和attachEvent以及element.onclick的区别

    addEventListener和attachEvent以及element.onclick的区别 attachEvent是ie添加事件处理程序,接收两个参数,其中事件类型名称要加"on&qu ...

  8. WebApp之PC客户端

    开发WebApp之PC客户端 HTML5的跨平台性还是很好的,苹果.Android手机都可以用,所在最近使用Jquery Mobile开发了一个手机端应用程序,一次开发,多个平台使用. 但我们的很多客 ...

  9. 解决MSSQL 2008不能用IP登录的问题

        解决MSSQL 2008不能用IP登录的问题   前提准备:mssql 2008已安装好了一个实例(我按默认情况下安装的实例是:SQLEXPRESS),并安装了SQL Server Manag ...

  10. 2440裸机驱动之PWM开发

    原文http://blog.chinaunix.net/uid-14114479-id-3125685.html ARM驱动蜂鸣器的方式有两种:一种是PWM输出口直接驱动,另一种是利用IO定时翻转电平 ...