本人也是初学go语言,作为一个后端工程师,Beego作为公司go项目主要使用的后端框架,肯定也需要进行一番研究。
与python的Django和Flask一致,Beego采用了非常经典的传统MVC架构设计模式,即
【用户请求】->【c层控制器截获,并分析需求】->【去M层获取数据】->【返回c层】->【去V层渲染视图】->【返回c层】->【返回给用户视图】
如图所示:
win下:Golang官网 ,可能需要翻墙。
然后狂点下一步就ok了,默认安在c盘根目录
推荐使用jetbrains家的Goland,下载地址
可以通过go env
来查看go环境
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\hexu0\AppData\Local\go-build
set GOEXE=.exe
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=E:\workspace\kbqa\go-path
set GOPROXY=
set GORACE=
set GOROOT=C:\Go
set GOTMPDIR=
set GOTOOLDIR=C:\Go\pkg\tool\windows_amd64
set GCCGO=gccgo
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
其中GOROOT、GOPATH、GOBIN这三种变量需要初学者手动配置。
go
的安装路径
当你安装好go
之后其实这个就已经有了
GOPATH
:也就是项目所在目录。允许多个目录,当有多个目录时,请注意分隔符(win下为;
)
GOPATH
目录约定有三个子目录:
projectpath(GOPATH)
|-- bin // golang编译可执行文件存放路径
|-- pkg // golang编译包时,生成的.a文件存放路径
└-- src // 源码路径,这里是存放所有go项目代码的地方。按照golang默认约定,go run,go install等命令的当前工作路径(即在 此路径下执行上述命令)。
以项目中example
为例,新建example
目录,将此目录配置到GOPATH
环境变量下
GOPATH=E:\workspace\beego-induction\example\;
cd E:\workspace\beego-induction\example\
:
其中-u是检查版本并下载,-v是显示下载过程。
执行指令go get -u -v github.com/astaxie/beego
执行指令go get -u -v github.com/beego/bee
然后你就会发现在example
目录下自动生成了bin
、pkg
和src
三个文件夹,这就说明beego安装成功,如果没有生成,检查一下是不是GOPATH
没有将该项目放在第一位。
执行指令 bee new 项目名称
例如:bee new mybeego
这条指令会在GOPATH
路径下的src
文件夹中创建go环境的初始配置。这里说明下虽然这条指令在根目录下执行指令也没啥问题,beego会自动寻找GOPATH
去创建工程项目。但是我们最好在终端中先进入GOPATH
再创建,这是考虑到可能会路径出错之类的问题
看到上面的输出后,表示项目创建完成,然后你就可以在src
文件夹下看到你的项目目录了。
进入项目目录,也就是刚才创建的src
下的mybeego文件夹下,文件夹下应有个名为main.go
的文件,这就是beego的启动文件,当前目录执行指令bee run
。此时终端会打印日志并提示服务器已经开启。
然后在浏览器中输入127.0.0.1:8080
你就能看到beego的欢迎页了
观察mybeego
项目下生成的文件,这些文件是在执行bee run
时生成的,每个文件作用如下:
conf 文件夹中放的是项目的配置文件
controllers 文件夹存放主要的业务逻辑模块
modules 文件夹存放主要的数据库业务模块
routers 路由文件夹存放【不同的请求,查找不同的内容】
static 文件夹存放静态资源,例如css,js,img等(通常不和数据库打交道的部分)
tests 文件夹存放测试文件,开发一般不动这个
view 文件夹存放视图显示html文件
mybeego.exe 这是bee run编译出来的.a文件
main.go 程序主入口文件
回到example文件,再次使用bee new hello_world
命令创建hello world项目
这时在src
文件夹下就有mybeego
和hello_world
两个项目了
projectpath(GOPATH)
|-- bin
|-- pkg
└-- src
|-- github.com # 安装beego时生成
|-- hello_world
└-- mybeego
随便写个首页,命名 hello world.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
html, body {
height: 100%;
}
body {
display: flex;
justify-content: center;
align-items: center;
}
</style>
</head>
<body>
<h1 style="color: deeppink"> HELLO WORLD <br> 小宋专享版beego教程</h1>
</body>
</html>
将此静态文件放在hello_world项目文件下的view目录下,你会在该目录下看到一个名为index.tpl的文件,这就是刚才启动项目时显示的页面。是beego支持的另一种格式的html,可以不使用。
-
在beego中,出于代码规范,对不同的url进行的post和get需要独立到单个文件,参照default.go我们来写个hwcontroller.go。
package controllers import "github.com/astaxie/beego" type HWController struct { beego.Controller } func (hw *HWController) Get() { // get请求 hw.TplName = "hello world.html" // 关联到刚创建的静态文件 }
-
通过controller文件,我们将逻辑与页面进行了关联,接下来就是需要让路由指向HWController
routers文件夹下的router.go文件就是用来进行路由关联的,添加新路由:
func init() { beego.Router("/", &controllers.MainController{}) beego.Router("/hello_world", &controllers.HWController{}) // 新路由 }
通过bee run
命令启动后,访问http://127.0.0.1:8080
,依然是beego的欢迎页,接下来访问http://127.0.0.1:8080/hello_world
,我们写的Hello world页面就出现啦
对于大多是项目,都是采用的前后端分离的方法,前端通过ajax发送各种请求,而后端只需要返回给前端json就可以了。json一般采用如下格式{'code':'','msg':'','date':''}
那beego如何返回json呢?
首先前后端分离,那就不需要在管我们的数据传输给那个前端,安心做个api就可以,所以首先需要在 conf文件夹下的app.conf
中关闭模板渲染
autorender = false
在hwcontroller.go
文件中定义json的字段和类型
type JSONStruct struct {
Code int
Msg string
Data string
}
// 不再需要前端页面,所以注释掉
//func (hw *HWController) Get() { // get请求
// hw.TplName = "hello world.html" // 关联静态文件
//}
func (hw *HWController) Get() { // get请求
json := &JSONStruct{0, "Success", "hello json"} #添加json数据
hw.Data["json"] = json
hw.ServeJSON()
return
}
然后启动服务访问http://127.0.0.1:8080/hello_world
,这下就返回json数据了~
还有一种方法,当json数据很少的时候,可以直接生成json而不用定义json type
func (c *LoginController) Get() {
c.Data["json"] = map[string]interface{}{"code":"0","msg":"Success"}
c.ServeJSON()
c.StopRun()
return
}