1 | 学习一门新语言的时候,一般喜欢先花几天时间过一遍语法,然后选一个热门的框架入手,再一步步深入。 |
Golang 环境搭建
Golang 的安装倒是挺简单,直接到 官网 就可以下载安装包安装,然后配置环境变量:
1
2
3
4
5GOPATH="/Users/tmp/Golang/GOPATH"
export GOPATH
GOBIN="/usr/local/go/bin:/Users/tmp/go/bin"
export GOBIN
export PATH=$PATH:$GOBIN麻烦的是工具链的下载,一开选择了VS Code 工具来开发,后来改用了 JetBrains 出的Golang IDE,虽然还是 EAP 版,不过对日常使用没什么影响,目前还是免费的。如果使用
go get
命令去下载工具链,等个大半天都没下载好,期间还经常出错,在国内做开发就是麻烦。我的做法是直接去 gitHub 上下载源码,然后本地编译,编译完之后再放到环境变量GOBIN
目录下。以下是涉及到的工具:1
2
3
4
5
6
7
8
9
10
11
12
13
14go-find-references
goimports
goreturns
go-outline
golint
gotests
go-symbols
gomodifytags
guru
gocode
gopkgs
godef
gorename
dlv以上工具链配置完之后再下载第三方框架
Beego
的工具Bee
,这环境算是配置好了。
Beego 框架
直接使用 Bee
工具的 bee new demo
命令生成一个demo项目, 进入目录,go build
之后就可以直接命令行执行生成的运行文件。
Beego 框架遵循 MVC 模式,以下是它自动生成的目录结构1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17demo
|-- conf
| `-- app.conf
|-- controllers
| `-- default.go
|-- main.go
|-- models
|-- routers
| `-- router.go
|-- static
| |-- css
| |-- img
| `-- js
|-- tests
| `-- default_test.go
`-- views
`-- index.tpl
Coding
Golang 跟C类似,它的运行入口在 main 方法。Beego
框架对原生的方法做了很多封装,对网络请求的处理会更便捷。
M: Model, 即数据模型,新的模型我们把它放到
models
文件夹下,例如新建一个BaseResponse
模型:1
2
3
4
5type BaseResponse struct {
Code string `json:"code"`
Msg string `json:"msg"`
Data interface{} `json:"data"`
}由于它的每个成员都是
public
的,所以它的首字母必须大写,成员后面的json
标签是为了定义它在JSON序列化时对应的字段名称。
V: View, 即视图,Beego使用的是视图模板,它放在
views
文件夹下。如果只是Api开发,不会使用到。C: Controller,即控制器,所有的业务逻辑会放到这里来处理,它被放到
controllers
文件夹下。例如新建一个TestController
控制器:1
2
3type TestController struct {
beego.Controller
}添加匿名成员
beego.Controller
,相当于TestController
继承beego.Controller
,拥有了它的成员变量和方法。路由,网络请求的Api定义,它在
routers
文件夹下,Beego
框架对路由的定义有好几种方法,以下是其中一种:1
2
3
4beego.Router("/test/version", &controllers.TestController{}, "*:Version")
beego.Router("/test/user", &controllers.TestController{}, "get:Get")
beego.Router("/test/friends", &controllers.TestController{}, "get:Friends")
beego.Router("/test/login", &controllers.TestController{}, "post:Post")第一个变量是定义网络请求的Api名称,第二个变量是网络请求的接收控制器,第三个是Api跟控制器的匹配定义。
:
符号之前是限定当前Api的请求方式,:
符号之后是Api请求对应的控制器方法名称。