252de9f2ea8c6c27bed4df4997ed83f2
Go web 初探

一、前言

上一篇我们讲解了 Go 单元测试,有了单元测试,我们就可以写出较为可靠的代码。本篇我们开始讲解 web 编程部分,你可以了解到 Go 包管理器和 gin 的基本使用等。

二、包管理器

包管理器对开发者来说是非常重要的,它是 JavaScript 的 npm、iOS 中的 Cocoapods、Android 的 Gradle、Java 的 Maven。我们可以想象下,如果没有包管理器,开发时需要用到第三方库或者需要对项目做组件化时,那是多么麻烦的一件事情。

在尝试 Go 一段时间之后,我发现 Go 的一个比较大的问题就是包管理不容易。例如我引用了一个 package:github.com/gin-gonic/gin,然后在 build 的时候先 go get -d 一遍,这里虽然 Go 可以很智能得帮我下载需要的 package,但是,下载的版本却默认是最新的。当然,这也不能怪 go get 这个命令,毕竟你也没告诉它是什么版本,所以给你个最新的也不奇怪,但是,如果我就是不要最新的怎么办?好像目前 go get 还没有这个功能(或者不能简单使用?)

1、Go 默认包管理

我最开始的做法是先用 go get -d 把需要的包下载下来,然后再切换到 $GOPATH,之后再 checkout 我需要的版本,这个过程很是繁琐和无趣,非常让人沮丧。不过,Go 也没有想象中的那么糟糕,在 Go 1.5之后,它已经意识到这个问题了,并且给除了一个解决方案,那就是 vendor

从 Go 1.6 之后,Go 会默认设置环境变量 GO15VENDOREXPERIMENT 为 1,然后当你使用 go get 时,他会在你的当前包的目录下建立一个 vendor 目录,然后将对应的 package 都下载到这个目录下,但是,还是需要你在这个目录里面切换到你需要的版本,好处就是你切换过一次,以后就不用切换了。这样的话,当你在代码中引用一个 package 时,golang 的查找顺序是:

  • 当前包下的 vendor 目录。
  • 向上级目录查找,直到找到 src 下的 vendor 目录。
  • 在 GOPATH 下面查找依赖包。
  • 在 GOROOT 目录下查找

然并卵,对于别的语言过来的开发者,还是太麻烦了!

2、Glide

默认的管理器太麻烦了,后面诞生了 Glide

安装

 curl https://glide.sh/get | sh

初始化

 glide init

获取

 glide get github.com/foo/bar
 glide get github.com/foo/bar#^1.2.3

安装依赖

glide install

更新依赖

glide update

一切都看起来很完美,像极了 npm。但是,它的 issue 有点多啊,使用中也确实不太稳定,经常因为网络问题而下载不到 package。

3、dep

终于等到官方的管理工具 dep

Mac OS 下可以直接使用 brew 安装和更新,其他平台请参考 dep安装指南

$ brew install dep
$ brew upgrade dep

使用方法也较为简单。先找到 GOPATH,不知道 GOPATH 路径的话,可以使用 go env 查看

$ go env
GOARCH="amd64"
GOBIN="/usr/local/go/bin"
GOCACHE="/Users/catchzeng/Library/Caches/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/catchzeng/go"    //就是这里了!!!
GOPROXY=""
...

cd 到 GOPATH/src/ 目录下新建项目

cd /Users/catchzeng/go/src/
mkdir web-demo

在 web-demo 文件夹中新建 main.go

cd web-demo
touch main.go
//main.go
package main

func main() {
}

初始化项目

dep init

安装依赖

dep ensure -add github.com/gin-gonic/gin

这时候 vendor 文件夹会加入所有依赖的代码、Gopkg.toml 也会加入 gin 的依赖信息,包括版本号。这些与 npm 都非常类似,这里就不再赘述,有问题的话,可以查看 dep 的文档

三、web 编程

使用 dep 安装完 gin package 后,我们就可以使用 gin 来一步步学习 web 编程了。

1、Hello World

```
//main.go

package main

import (
"net/http"

"github.com/gin-gonic/gin"

)

func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.String(http.StatusOK, "Hello World!")

top Created with Sketch.