Go實戰準備工作---BeenGo的使用

棋佈發表於2020-10-09

@Go實戰準備工作—BeeGo的使用

之前就討論過,究竟是使用Beego還是Gin,其實兩者之間Gin的效率是要高於BeeGo的,並且也比BeeGo更加靈活。其他的框架就不加入參考了,start太少了,就跟招聘一樣,不是985/211的有些企業都不看。但是,我們還是選擇了BeeGo。理由是:大家都是PHP出身的,BeeGo生成的MVC架構模式,大家比較容易理解一點,路由和日誌都是封裝好了的,並且,Session也是自帶的。說成偽裝成PHP的Go框架,一點不為過。開發速度也是比Gin要快一點,畢竟人家都幫你搭建好了基本骨架。雖然很low,但是企業也要計算成本,時間和效率。基於之前的專案用的是Gin,這次基本要重新研究這個架構了,既然要用,就用個全套的。    選擇使用的依賴庫有
_ "Callout_Go/routers"
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
這個可以網上去看,很多教程的,可能比我這個還詳細。以Windows環境為例,首先,下載並安裝好GO並配置好GOROOTGOPATH環境變數(如果您是用msi包安裝的go,那麼這些環境變數已經設定好了)。並在Path環境變數中加入%GOPATH%\bin和%GOROOT%bin。直接在Terminal視窗下執行go get github.com/astaxie/beego,可能會碰到連線超時問題,這個可以配置GitHub的ip到本地的hosts檔案下,會快很多,切記加上代理,否則真的會等好半天,有翻牆的同學,就厲害了。

在Terminal視窗下執行 go get github.com/beego/bee在%GOPATH%\bin下會有bee.exe檔案
在這裡插入圖片描述
驗證安裝結果
在這裡插入圖片描述
bee提供自動生成工程命令,bee new projectName
生成之後進入工程,執行bee run 或者bee run main.go
執行結果是:
在這裡插入圖片描述
對於習慣使用GoLand工具的夥伴,第一次開啟BeeGo生成的工程會各種報錯,還沒法直接引用,有潔癖或者強迫症的人,看著心裡就很難受。我使用go mod vendor 生成vendor資料夾,這樣就沒有錯誤,也方便我們提交git的時候少加一點依賴庫。
在這裡插入圖片描述

簡單粗暴,直接使用介面接收和響應操作。只需要在main入口函式出呼叫beego.Run()就可以執行了,配置檔案可以直接寫在app.conf檔案中,資料庫的連線需要先註冊,並設定一個預設的資料庫別名,否則會連線失敗並提示缺少default預設資料庫,有點詭異,後面進行實際開發肯定也會有其他詭異的地方。簡短的mian函式處理程式碼片段參考下:
func main() {
   beego.BConfig.WebConfig.Session.SessionOn = true//開始session
   defaultDB := beego.AppConfig.String("defaultDB")
   err := orm.RegisterDriver("mysql", orm.DRMySQL)
   if err != nil {
      fmt.Println("RegisterDriver err: ", err)
   }
   err = orm.RegisterDataBase("default", "mysql", defaultDB)
   if err != nil {
      fmt.Println("RegisterDataBase err: ", err)
   }
   beego.Run()
}
後端資料統一的問題,這個有的公司可能還沒有,但是目前來說大部分公司介面返回資料並沒有一個統一的格式,比如我們公司的其他專案組,不過多解釋,聽到就蛋疼,前後端都是肉痛,算是前人留坑,後人懶的結果吧,當然,公司高層不作為也算一個原因。好在,目前的這個專案是有個大致的框架的,所以,我們統一寫個返回函式處理。直接在controllers資料夾下建立一個公共控制器,內容如下:
package controllers

import "github.com/astaxie/beego"

type CommonController struct {
    beego.Controller
}

type JsonStruct struct {
    Code  int         `json:"code"`
    Msg   string      `json:"msg"`
    Data  interface{} `json:"data"`
    Count int64       `json:"count,omitempty"`
}

func ReturnSuccess(msg string, data interface{}, count int64) (json *JsonStruct) {
    json = &JsonStruct{Code: 0, Msg: msg, Data: data, Count: count}
    return
}

func ReturnError(code int, msg string) *JsonStruct {
    json := &JsonStruct{Code: code, Msg: msg}
    return json
}
注意,返回的json的屬性值,這個花了我好半天才找到的,簡直是要命。 `json:"count,omitempty"   第一個引數是轉json之後的屬性輸出的值,第二個引數是如果count=0,字串就是“”以此類推,變數值是預設值的話,就不輸出。換句話說,count=0,這個屬性就不輸出了。

至此,基本工作已經做好了,接下來就進行業務上的開發了。
本作品採用《CC 協議》,轉載必須註明作者和本文連結
歡迎轉載分享提意見,一起code

相關文章