配置 Golang 开发环境

为想尝试 Go 的朋友开个头,介绍环境的配置。语言的优缺点不在此展开。

因身边多数使用 Win64 环境,以下无特殊说明均以 Win64 为例,日后有需要再补充其他平台部分。

1. Go

1.1 安装

访问官网下载页面,获取对应版本。不过如果你不懂得翻-墙,会发现访问不了官网,因为它在 Google 的服务器上。这点请自行解决。不过经过 PuTTY 和 iOS SDK 第三方下载被植入木马的事件,劝各位还是努力到官网下载。

Win64 的安装文件一般为 go1.xx.y.windows-amd64.msi ,下载好后安装,路径默认或自定义,没有强制要求,不要出现中文和空格,尽量短一些即可。个人路径供参考: D:\Dev\Go

1.2 环境变量

安装后设置环境变量,指定 官方工具包(及内置库) 和 工作目录。

以下设置均在:我的电脑(Win10 此电脑) > 右键菜单 > 属性 > 高级系统设置 > 环境变量 , 如果变量存在就确认内容,不存在就新建。

1.2.1 GOROOT

指定 Go 的安装目录,并以此确定工具包和内置库的位置。确保 GOROOT 指向 Go 的安装目录 (例: D:\Dev\Go)。

1.2.2 GOPATH

指定 Go 的 workspace(工作目录)。GOPATH 允许指定多个 workspace,中间以 ; 隔开(跟 PATH 类似,其他平台下的分隔符是 :)。可以在任意一个 workspace 下开发,但是 go getgo install 的包只会放在第一个目录。当引用包的时候,会先查找 %GOROOT%\pkg 的语言内置包,再顺序查找每个 workspace 的 src 目录,找到就结束。

一般情况下,推荐设置两个 workspace : 第一个存放下载的第三方依赖包,第二个存放本地开发的代码,分开避免混淆。例:C:\Users\Jayce\go;E:\workspace\go

1.2.3 PATH

PATH 是系统自带的执行路径,所以我们不能覆盖它,只能在后面追加。需要将GOROOT 的 bin 目录第一个 workspace 的 bin 目录加入 PATH ,以调用 官方工具包 和 安装的第三方工具。其中如果你检查 GOROOT 的时候发现 GOROOT 已经配置好了,有可能 %GOROOT%\bin 也已经添加了,你可以复制到记事本里检查一下。

假定两个都没有添加,那么以上述 GOPATH 的配置为例,则是 原来的PATH内容;%GOROOT%\bin;C:\Users\Jayce\go\bin

注:Win10 对 PATH 的管理进行了优化,不再是一长串用 ; 分隔的路径,而是一个路径的列表,追加时只需新建子项即可。

1.3 验证

打开 cmd,然后按如下操作

1
2
3
4
5
# 查看安装版本
go version
# 正常应该显示你安装的版本
# 找不到指令请检查安装 GOROOT 的安装目录是否正确 / PATH 里是否包含了 %GOROOT%\bin
go version go1.10.1 windows/amd64

2. gcc 和 make

有时部分依赖包以 C 开发,需要用到 gcc 编译;另外,为简化编译流程,项目规模增大后会逐渐交由 make 管理编译。两个工具在 Linux 下一般自带,或通过系统的包管理很轻易地安装,Windows 下则要安装 MinGW-w64 。注意必须是 MinGW-w64 。MinGW 不兼容 64 位系统,同时长期不更新;而 w64 可以同时兼容 32 和 64 位。

2.1 安装

下载得到的是安装器,在选择版本后,会自动下载对应版本并安装。建议不要改动任何选项,只需要确保 Architecture 对应你的计算机即可(Win64 选 x86_64)。

安装路径依然没有强制要求,无中文和空格,尽量短即可。参考:D:\Dev\mingw-w64

2.2 创建 make 的软链接

安装完后进入 安装目录的 bin 目录,可以看到大量的工具,其中有 gcc.exemingw32-make.exe ,没有 make.exe 。其实 mingw32-make.exe 就是,但是用这个名字调用太长,也不利于其他工具用默认的名字调用,所以我们要创建一个名字叫 make.exe 的软链。

首先用管理员权限打开 cmd (右键菜单 > 用管理员权限打开),然后按如下操作:

1
2
3
4
5
# 请修改路径对应你的安装目录
C:\Windows\system32>cd /d D:\Dev\mingw-w64\bin
D:\Dev\mingw-w64\bin>mklink make.exe mingw32-make.exe
为 make.exe <<===>> mingw32-make.exe 创建的符号链接

建议创建软链之后就关掉管理员权限的 cmd,避免因权限过高造成不可恢复的误操作。后续操作在普通权限下执行即可。

完成后你会看到 bin 目录下多了一个 make.exe 文件,然后执行 dir make.exe ,会看到

1
2
D:\Dev\mingw-w64\bin>dir make.exe
2018/10/04 18:17 <SYMLINK> make.exe [mingw32-make.exe]

2.3 PATH 环境变量

跟 Go 安装类似的, bin 目录也要追加到 PATH 目录的最后,详细可以参考 1.2.3 Go 的 PATH 环境变量部分。

特别强调:mingw-w64 下面还有一套 mingw32,添加到 PATH 的是根目录的 bin,不是 mingw32 下面的!!

1
2
3
4
5
mingw-w64
├── bin # 64位系统认准这个!!
├── mingw32
│ ├── bin # 不是这个
......

2.4 验证

1
2
3
4
gcc --version
# 正常会输出 gcc 的版本,64位:x86_64, 32位:i686; 注意区分
make -v
# 能调用就行,不需要留意位数

3. 项目包管理及编译

3.0 预备知识:Go 的目录结构与包管理

每个 workspace 下都有三个指定用途的目录,用到的时候如果不存在,会自动创建:

1
2
3
├── bin # 存放 install 之后的可执行文件
├── pkg # 存放编译之后链接之前的中间文件
└── src # 存放 包 的源文件

其中 go get 获得的 src 和 go install 获得的 bin ,会放在第一个 workspace 中,所以建议至少添加两个 workspace,并在第二个进行本地开发,避免混淆。

Go 语言引用包时,需要在代码开头 import 对应包的路径(非包名,虽然路径的最后一层目录往往跟包名一样,但也可以不一样):

1
2
3
4
import (
"../local/relative/path" // 相对路径。不纳入 workspace 的小项目允许。正规项目需要纳入,会报错!!
"github.com/urface/cli" // 全局路径。
)

全局路径的 import

  1. 先在 %GOROOT%\pkg 查找内置的包(已编译,所以引用 pkg)
  2. 再在每个 workspace 的 src 目录查找
  3. 在 1.6 版本后新增了项目根目录下的 vendor 目录,可以通过依赖管理工具拷贝特定版本的依赖,方便锁定依赖的版本,并随项目源码一起提交。

使用了 local import 的包,不能被别的包 import,所以在正式项目中基本是禁止使用的。那么需要被引用的包只能存放在 src 或者 vendor 中。

跟 Java 相比最大的差别就是, 项目的根目录不在 import 的搜索范围内 。Java 项目内的包,包名(跟路径对应)不包括项目名,从根目录下开始算;Go 没有项目本地包的概念,都是全局 import,包路径从 src 下开始算,所以项目根目录名也是包路径的一部分。由此得出结论:

  • Go 项目必须在 workspace 的 src 目录下开发
  • 根目录 名字确定后就不能随意更改 ,否则项目内的互相 import 都得改

3.1 包管理

有了上述知识准备,接下来的内容就容易理解了。

  • git clone 必须在 (第二个) workspace 的 src 目录进行 (后续要新建项目同理)。
  • 项目名(例:myproj) 需要跟 import 路径 (import myproj/xxx/yyy) 保持一致,新建项目时就要考虑,clone 之后不能修改目录名。
  • 推荐使用官方的依赖管理工具 dep,所有第三方依赖都会拷贝到 vendor 跟源码一起管理,clone 后不需 go get 对应的依赖。

3.2 编译

在确保做好包管理的基础上,编译就很简单了,在根目录打开 cmd:

1
go build

即可。

(后续项目复杂度增加后,编译建议交给 make 管理。)

4. IDE

  • LiteIDE:LiteIDE is a simple, open source, cross-platform Go IDE

    国人开发的开源跨平台 IDE,简单,免费,够用。

  • GoLand:A Clever IDE to Go by JetBrains

    IDE 名门 JetBrains 出品,口碑很好,就是要付费。

  • Visual Studio Code:Code Editing. Redefined

    传统软件巨头微软拥抱开源之后的 开源 IDE ,热度很高;并非专门为 Go 设计,但提供相关插件。

视乎你更习惯哪个 IDE,看你自己喜欢。

5. 其他工具

  • bindata:将资源文件编译成 go 源码,参与编译。(类似 Android 下的 R.java)
  • dep:Go 官方依赖管理工具,将指定版本的第三方依赖拷贝到 vendor 目录,跟源码一起管理。

知识共享 “署名-非商业性使用-相同方式共享” 4.0 (CC BY-NC-SA 4.0)”许可协议
本文为本人原创,采用知识共享 “署名-非商业性使用-相同方式共享” 4.0 (CC BY-NC-SA 4.0)”许可协议进行许可。
本作品可自由复制、传播及基于本作品进行演绎创作。如有以上需要,请留言告知,在文章开头明显位置加上署名(Jayce Chant)、原链接及许可协议信息,并明确指出修改(如有),不得用于商业用途。谢谢合作。
详情请点击查看协议具体内容。