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
}

 

運行結果如下:

 

 
 
 
 
        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM