Go實戰準備工作---BeeGo的使用
- 搭建Beego環境
- 安裝Bee工具
- 使用orm和web功能代碼
- 資料封裝統一處理
之前就讨論過,究竟是使用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"
搭建Beego環境
這個可以網上去看,很多教程的,可能比我這個還詳細。以Windows環境為例,首先,下載下傳并安裝好GO并配置好GOROOT和GOPATH環境變量(如果您是用msi包安裝的go,那麼這些環境變量已經設定好了)。并在Path環境變量中加入%GOPATH%\bin和%GOROOT%bin。
直接在Terminal視窗下執行go get github.com/astaxie/beego,可能會碰到連接配接逾時問題,這個可以配置GitHub的ip到本地的hosts檔案下,會快很多,切記加上代理,否則真的會等好半天,有翻牆的同學,就厲害了。
安裝Bee工具
在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的時候少加一點依賴庫。
使用orm和web功能代碼
簡單粗暴,直接使用接口接收和響應操作。隻需要在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,這個屬性就不輸出了。
至此,基本工作已經做好了,接下來就進行業務上的開發了。