(本文為轉載,原文: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的安裝這里就不多說了,百度一下,可以找到很多相關技術博客,官方文檔也有很詳細的介紹。
環境介紹:
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 }
運行結果如下:
