• Beego学习笔记——开始


    (本文为转载,原文: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 0
    }
    但是怎么让这个函数在我们输入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[0]]; ok{
                         ret := handler(tokens)
                         if ret != 0{
                                break
                         }
                  }else {
                         fmt.Println("Unknown Command:", tokens[0])
                  }
           }
    }
    运行结果如下:
    下面我们在增加一个退出命令。完整的代码如下:
    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[0]]; ok{
                         ret := handler(tokens)
                         if ret != 0{
                                break
                         }
                  }else {
                         fmt.Println("Unknown Command:", tokens[0])
                  }
           }
    }
    
    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 0
    }
    
    func Quit(args []string) int{
           return 1
    }
    运行结果如下:
     
     
     
     
            
  • 相关阅读:
    HDU 3068 最长回文
    UVa 1377 / LA 3667 Ruler
    HDU 1540 Tunnel Warfare
    POJ 3450 Corporate Identity
    外贸网站成功运营五个要点
    SEO白帽必备孙子兵法之三十六计
    修改zencart模版的相关资料
    怎么做友情链接,PR值即将更新之际 教你10招快速提升PR值到4
    基于zencart搭建外贸网站流程
    网站内链优化需要考虑的方面
  • 原文地址:https://www.cnblogs.com/ChainZhang/p/6223193.html
Copyright © 2020-2023  润新知