Go实战准备工作---BeenGo的使用

@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并配置好GOROOTGOPATH环境变量(如果您是用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,这个属性就不输出了。

至此,基本工作已经做好了,接下来就进行业务上的开发了。
本作品采用《CC 协议》,转载必须注明作者和本文链接
生命有限,随心而活,写代码不香吗?
棋布
讨论数量: 3
Dennis_Ritchie

小伙子可以啊 :+1:

2周前 评论
棋布

@Dennis_Ritchie 唉,都是为了混口饭吃,都不容易啊 :joy:

2周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!