Golang上手体验

1
学习一门新语言的时候,一般喜欢先花几天时间过一遍语法,然后选一个热门的框架入手,再一步步深入。

Golang 环境搭建

  • Golang 的安装倒是挺简单,直接到 官网 就可以下载安装包安装,然后配置环境变量:

    1
    2
    3
    4
    5
    GOPATH="/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
    14
    go-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
17
demo
|-- 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
    5
    type 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
    3
    type TestController struct {
    beego.Controller
    }

    添加匿名成员beego.Controller,相当于 TestController 继承 beego.Controller ,拥有了它的成员变量和方法。

  • 路由,网络请求的Api定义,它在routers文件夹下,Beego框架对路由的定义有好几种方法,以下是其中一种:

    1
    2
    3
    4
       beego.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请求对应的控制器方法名称。

代码

源码: https://github.com/AbooJan/BeegoDemo