乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      淺析GO語言中的beego框架

       菌心說 2021-09-08
      beego是一個快速開發(fā)Go應(yīng)用的http框架,作者是SegmentFault 用戶,go 語言方面技術(shù)大牛。beego可以用來快速開發(fā)API、Web、后端服務(wù)等各種應(yīng)用,是一個 RESTFul的框架,主要設(shè)計靈感來源于 tornado、sinatra、 flask這三個框架,但是結(jié)合了Go本身的一些特性(interface、struct繼承等)而設(shè)計的一個框架。

      架構(gòu)



      beego是基于八大獨(dú)立的模塊之上構(gòu)建的,是一個高度 解耦的框架。當(dāng)初設(shè)計beego的時候就是考慮功能模塊化,用戶即使不適用beego的http邏輯,也是可以在使用這些獨(dú)立模塊,例如你可以使用cache模塊來做你的緩存邏輯,使用日志模塊來記錄你的操作信息,使用 config模塊來解析你各種格式的文件,所以不僅僅在beego開發(fā)中,你的socket游戲開發(fā)中也是很有用的模塊,這也是beego為什么受歡迎的一個原因。大家如果玩過樂高的話,應(yīng)該知道很多高級的東西都是一塊一塊的積木搭建出來的,而設(shè)計beego的時候,這些模塊就是積木,高級機(jī)器人就是beego。至于這些模塊的功能以及如何使用會在后面的文檔會逐一介紹。

      執(zhí)行邏輯



      既然beego是基于這些模塊構(gòu)建的,那么他的執(zhí)行邏輯是怎么樣的呢?beego是一個典型的MVC架構(gòu),他的執(zhí)行邏輯如下圖所示:

      項目結(jié)構(gòu)


      一般的beego項目的目錄如下所示:
      ├── conf
      │ └── app.conf
      ├── controllers│
      ├── admin
      │ └── default.go
      ├── main.go
      ├── models
      │ └── models.go
      ├── static│
      ├── css│
      ├── ico
      │ ├── img
      │ └── js└── views
      ├── admin
      └── index.tpl
      從上面的目錄結(jié)構(gòu)我們可以看出來M(models目錄)、V(views目錄)、C(controllers目錄)的結(jié)構(gòu),main.go是入口文件。

      選擇 Go 語言

      斷斷續(xù)續(xù)看了 Go 幾個星期了,講真的真是喜歡的不得了。認(rèn)真學(xué)過之后,你會覺得非常的優(yōu)雅,寫東西很舒服。學(xué)習(xí) Go 我覺得很有必要的是,Go 中自帶的數(shù)據(jù)結(jié)構(gòu)很少,類似于 List 或者 Tree 之類的,最好嘗試一下如何去設(shè)計一些常用的數(shù)據(jù)結(jié)構(gòu)。話說回來,Go 的出身始終是一門后端語言。我非常后悔用 Flask 或者 Django 來作為我的后端入門框架或者選擇。封裝的太好了,往往對于一個入門新手來說學(xué)習(xí)不到什么。

      而 Go 就不一樣了,它天生被設(shè)計是一門后端語言。也就是說,你將會學(xué)習(xí)到非常多的后端知識??纯聪旅孢@一張圖,當(dāng)時我看著就有一種很過癮的感覺,因為這些知識你都知道,但是作為一個后端開發(fā)者你沒有去了解過,這是非常大的失誤。并不是想去用學(xué)習(xí)好 Go 去彌補(bǔ)沒有學(xué)習(xí)好 C++ 的遺憾,只是新生事物,多嘗試嘗試總是極好的,哪怕只是淺嘗輒止。Go 作為一門新的語言,其語言設(shè)計的特性,背后 Google 爸爸的撐腰以及現(xiàn)在 Docker 技術(shù)發(fā)展,前景應(yīng)該還是不錯的。所以如果你是編程新手或者是想入門后端的開發(fā)者,我強(qiáng)烈建議你選擇 Go 語言。

      語言學(xué)到最后,框架總是少不了的。雖然不能完全依賴框架,但是還是可以學(xué)習(xí)一下框架的設(shè)計思想。對于 Beego 框架的評價總是各種各樣,這也要看自己的選擇了。之所以選擇 Beego 框架來入門,主要是因為其詳細(xì)的文檔以及教程示例非常多。

      Go Web 初探

      先看一下最基本的 Go 中的 web 服務(wù),只用到了 Go 中的 net/http 這個包:

      1. package main
      2. import (
      3. 'fmt'
      4. 'net/http'
      5. 'strings'
      6. 'log'
      7. )
      8. func sayhelloName(w http.ResponseWriter, r *http.Request) {
      9. r.ParseForm() //解析參數(shù),默認(rèn)是不會解析的
      10. fmt.Println(r.Form) //這些信息是輸出到服務(wù)器端的打印信息
      11. fmt.Println('path', r.URL.Path)
      12. fmt.Println('scheme', r.URL.Scheme)
      13. fmt.Println(r.Form['url_long'])
      14. for k, v := range r.Form {
      15. fmt.Println('key:', k)
      16. fmt.Println('val:', strings.Join(v, ''))
      17. }
      18. fmt.Fprintf(w, 'Hello astaxie!') //這個寫入到w的是輸出到客戶端的
      19. }
      20. func main() {
      21. http.HandleFunc('/', sayhelloName) //設(shè)置訪問的路由
      22. err := http.ListenAndServe(':9090', nil) //設(shè)置監(jiān)聽的端口
      23. if err != nil {
      24. log.Fatal('ListenAndServe: ', err)
      25. }
      26. }

      執(zhí)行 go run web.go根據(jù)提示在瀏覽器地址欄打開 URL ,如下圖所示:

      安裝 Go 以及 Beego

      基本的你得有個 Go 語言的環(huán)境,安裝什么的就不講了。只是最后配置其環(huán)境變量許多人都容易弄錯,包括我自己也是。其實多次也能夠配置好,只是每次重新啟動就提示上次的配置無效,也不知道是怎么回事。講一下安裝 Beego 框架

      1. export GOBIN='/usr/local/go/bin'
      2. export GOPATH='/Users/allenwu/GoProjects'
      3. export PATH='$PATH:$GOBIN:$GOPATH/bin'

      在終端輸入如上所示代碼,其中 allenwu 替換成你自己的 username,并且在根目錄下創(chuàng)建 GoProjects 文件夾,作為下一步工作目錄。配置好之后,輸入如下命令確保保存成功:

      source ~/.zshrc

      最后當(dāng)然要測試一下環(huán)境變量是否配置成功,在 shell 中輸入 go env若如下所示即表明成功(著重注意一下的就是 gopath 是不是為空):

      配置環(huán)境沒問題之后,就是安裝 go 和 bee 工具了:

      1. $ go get github.com/astaxie/beego
      2. $ go get github.com/beego/bee

      檢查安裝是否成功,啟動一個 Hello world級別的 App:

      1. $ cd $GOPATH/src
      2. $ bee new hello
      3. $ cd hello
      4. $ bee run hello

      會提示你在瀏覽器輸入地址,然后就能知道是否安裝成功啦。

      體驗 Beego 框架

      如下圖所示即為 Beego 官網(wǎng)所提供的 Beego 框架概覽,一眼就能明白其 MVC 模式的構(gòu)造,結(jié)構(gòu)也是非常清晰的。

      安裝好 Beego 框架之后,官方給了三個 samples,我們選擇其中一個來進(jìn)行入門體驗一下。如下實例選擇的是 todo App。我們將 clone 下來的 todo App 放置到指定目錄下,用 sublimeText3 打開這個示例項目,強(qiáng)烈建議你打開側(cè)邊欄設(shè)置選項:

      了解完基本的結(jié)構(gòu)之后,我們啟動這個 App。我們采用 Beego 提供的工具 bee 來啟動。進(jìn)入到最終的指定文件夾 todo 之后,執(zhí)行 bee run 命令:

      可以看到打印出一個 Bee 的 Logo,表示啟動成功了,稍等一下就會繼續(xù)提示你在瀏覽器中輸入指定 IP 地址和端口號,也就是如下所示:

      官方講這個小 App 結(jié)合了 Angular ,體驗還是挺不錯的。接下來我們來簡單分析一下示例 App 的代碼結(jié)構(gòu)。首先入口程序是 Main.go,這是想都不用想的,一個程序員的直覺:

      1. package main
      2. import (
      3. 'github.com/astaxie/beego'
      4. // 注釋一
      5. 'samples/todo/controllers'
      6. )
      7. func main() {
      8. // 注釋二
      9. beego.Router('/', &controllers.MainController{})
      10. beego.Router('/task/', &controllers.TaskController{}, 'get:ListTasks;post:NewTask')
      11. beego.Router('/task/:id:int', &controllers.TaskController{}, 'get:GetTask;put:UpdateTask')
      12. // 注釋三
      13. beego.Run()
      14. }

      我們第一感覺還是看到 Main() 函數(shù),看到了 Router() 函數(shù),有一些 web 開發(fā)或者開發(fā)經(jīng)驗的應(yīng)該都知道這是路由機(jī)制。對應(yīng)的是 url 與 Controller。在 MVC 框架中 Controller 是一個很重要的概念了。我們自然下一步驟就是去往 Controller 中看看:

      1. package controllers
      2. import (
      3. 'github.com/astaxie/beego'
      4. )
      5. // 注釋一
      6. type MainController struct {
      7. beego.Controller
      8. }
      9. // 注釋二
      10. func (this *MainController) Get() {
      11. // 注釋三
      12. this.TplName = 'index.html'
      13. this.Render()
      14. }

      在看完 Go 的基本語法之后,看到注釋一應(yīng)該也能明白一個一二三四了,我們聲明了一個控制器 MainController,這個控制器里面內(nèi)嵌了 beego.Controller,這就是 Go 的嵌入方式,也就是 MainController 自動擁有了所有 beego.Controller 的方法。而 beego.Controller 擁有很多方法,其中包括 Init、PreparePost、Get、Delete、Head等 方法。我們可以通過重寫的方式來實現(xiàn)這些方法,而我們上面的代碼就是重寫了 Get 方法。

      在注釋三處,我們看到了 index.html,應(yīng)該明白了 Get 方法去獲取對應(yīng)名稱的 HTML 文件,并進(jìn)行渲染。到這里我們很簡單的講述了一下 MVC 中的 V 和 C,發(fā)現(xiàn)沒,Model 竟然不知道從哪去講。還請回頭看看 Main.go 中的注釋二處:

      1. beego.Router('/task/', &controllers.TaskController{}, 'get:ListTasks;post:NewTask')

      上述路由引導(dǎo)我們進(jìn)入了 TaskController 這個控制器來了,我們分析一下下面這個文件:

      1. package controllers
      2. import (
      3. 'encoding/json'
      4. 'strconv'
      5. 'github.com/astaxie/beego'
      6. 'samples/todo/models'
      7. )
      8. type TaskController struct {
      9. beego.Controller
      10. }
      11. // Example:
      12. //
      13. // req: GET /task/
      14. // res: 200 {'Tasks': [
      15. // {'ID': 1, 'Title': 'Learn Go', 'Done': false},
      16. // {'ID': 2, 'Title': 'Buy bread', 'Done': true}
      17. // ]}
      18. func (this *TaskController) ListTasks() {
      19. res := struct{ Tasks []*models.Task }{models.DefaultTaskList.All()}
      20. this.Data['json'] = res
      21. this.ServeJSON()
      22. }

      很明顯我們看到了 models 關(guān)鍵字,并且調(diào)用了其中的 Task ,我們選擇進(jìn)入 Task.go 文件看看:

      1. package models
      2. import (
      3. 'fmt'
      4. )
      5. var DefaultTaskList *TaskManager
      6. // Task Model
      7. type Task struct {
      8. ID int64 // Unique identifier
      9. Title string // Description
      10. Done bool // Is this task done?
      11. }
      12. // NewTask creates a new task given a title, that can't be empty.
      13. func NewTask(title string) (*Task, error) {
      14. if title == '' {
      15. return nil, fmt.Errorf('empty title')
      16. }
      17. return &Task{0, title, false}, nil
      18. }
      19. // TaskManager manages a list of tasks in memory.
      20. // 注釋一
      21. type TaskManager struct {
      22. tasks []*Task
      23. lastID int64
      24. }
      25. // NewTaskManager returns an empty TaskManager.
      26. func NewTaskManager() *TaskManager {
      27. return &TaskManager{}
      28. }
      29. // Save saves the given Task in the TaskManager.
      30. func (m *TaskManager) Save(task *Task) error {
      31. if task.ID == 0 {
      32. m.lastID++
      33. task.ID = m.lastID
      34. m.tasks = append(m.tasks, cloneTask(task))
      35. return nil
      36. }
      37. for i, t := range m.tasks {
      38. if t.ID == task.ID {
      39. m.tasks[i] = cloneTask(task)
      40. return nil
      41. }
      42. }
      43. return fmt.Errorf('unknown task')
      44. }
      45. // cloneTask creates and returns a deep copy of the given Task.
      46. func cloneTask(t *Task) *Task {
      47. c := *t
      48. return &c
      49. }
      50. // All returns the list of all the Tasks in the TaskManager.
      51. func (m *TaskManager) All() []*Task {
      52. return m.tasks
      53. }
      54. // Find returns the Task with the given id in the TaskManager and a boolean
      55. // indicating if the id was found.
      56. func (m *TaskManager) Find(ID int64) (*Task, bool) {
      57. for _, t := range m.tasks {
      58. if t.ID == ID {
      59. return t, true
      60. }
      61. }
      62. return nil, false
      63. }
      64. func init() {
      65. DefaultTaskList = NewTaskManager()
      66. }

      如上所示的 task Model 主要就是定義了 task 這個實體該有的成員變量。以及一個 taskManager 來管理這些 task,其整體結(jié)構(gòu)在理解了 Go 語言的一些基本的機(jī)制之后還是比較簡單的。

      在之前的整個實例結(jié)構(gòu)中,我們還看到了如下所示的靜態(tài)文件,它們的作用就很明顯啦:

      1. ├── static
      2. │ ├── css
      3. │ ├── img
      4. │ └── js

      好了,以上就是 Go 的一個框架 Beego 的入門實例了,其實很簡單。我也只是簡單的寫一下入門的東西。后續(xù)研究一下 Go 的自動化 API 構(gòu)建。往后繼續(xù)學(xué)習(xí) Go 和 Docker 的結(jié)合應(yīng)用吧。

      【參考文章】
      1、Go中國技術(shù)社區(qū) - golang https:///
      2、首頁 - beego: 簡約 & 強(qiáng)大并存的 Go 應(yīng)用框架 https:///
      3、beego:從入門到放棄 -  http://blog.csdn.net/github_37320188/article/details/79107380

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多