Beego學習筆記——開始

(本文爲轉載,原文:Beego學習筆記——開始)css

beego簡介

beego是一個快速開發Go應用的http框架,他能夠用來快速開發API、Web、後端服務等各類應用,是一個RESTFul的框架,主要設計靈感來源於tornado、sinatra、flask這三個框架,可是結合了Go自己的一些特性(interface、struct繼承等)而設計的一個框架。flask

beego的架構

beego的總體設計架構以下所示:後端

 

 

beego是基於八大獨立的模塊之上構建的,是一個高度解耦的框架。當初設計beego的時候就是考慮功能模塊化,用戶即便不適用beego的http邏輯,也是能夠在使用這些獨立模塊,例如你可使用cache模塊來作你的緩存邏輯,使用日誌模塊來記錄你的操做信息,使用config模塊來解析你各類格式的文件,因此不單單在beego開發中,你的socket遊戲開發中也是頗有用的模塊,這也是beego爲何受歡迎的一個緣由。你們若是玩過樂高的話,應該知道不少高級的東西都是一塊一塊的積木搭建出來的,而設計beego的時候,這些模塊就是積木,高級機器人就是beego。至於這些模塊的功能以及如何使用會在後面的文檔會逐一介紹。緩存

beego的執行邏輯

既然beego是基於這些模塊構建的,那麼他的執行邏輯是怎麼樣的呢?beego是一個典型的MVC架構,他的執行邏輯以下圖所示:架構

 

 

beego項目結構

通常的beego項目的目錄以下所示:app

├── 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
        後面沒有特殊說明的話,都是以此爲背景。
 
一、新建工程
以下圖,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
}

 

運行結果以下:
相關文章
相關標籤/搜索