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"
搭建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,这个属性就不输出了。
至此,基本工作已经做好了,接下来就进行业务上的开发了。