文章目录
在 Windows 上安装 Go
你可以在 下载页面 页面下载到 Windows 系统下的一键安装包。
前期的 Windows 移植工作由 Hector Chu 完成,但目前的发行版已经由 Joe Poirier 全职维护。
在完成安装包的安装之后,你只需要配置 $GOPATH
这一个环境变量就可以开始使用 Go 语言进行开发了,其它的环境变量安装包均会进行自动设置。在默认情况下,Go 将会被安装在目录 c:\go
下,但如果你在安装过程中修改安装目录,则可能需要手动修改所有的环境变量的值。
如果你想要测试安装,则可以使用指令 go run
运行 hello_world1.go。
如果发生错误 fatal error: can’t find import: fmt
则说明你的环境变量没有配置正确。
如果你想要在 Windows 下使用 cgo (调用 C 语言写的代码),则需要安装 MinGW,一般推荐安装 TDM-GCC。如果你使用的是 64 位操作系统,请务必安装 64 位版本的 MinGW。安装完成进行环境变量等相关配置即可使用。
在 Windows 下运行在虚拟机里的 Linux 系统上安装 Go:
如果你想要在 Windows 下的虚拟机里的 Linux 系统上安装 Go,你可以选择使用虚拟机软件 VMware,下载 VMware player,搜索并下载一个你喜欢的 Linux 发行版镜像,然后安装到虚拟机里,安装 Go 的流程参考第 2.3 节中的内容。
在 Linux 上安装 Go
如果你能够自己下载并编译 Go 的源代码的话,对你来说是非常有教育意义的,你可以根据这个页面找到安装指南和下载地址:Download the Go distribution。
我们接下来也会带你一步步地完成安装过程。
-
设置 Go 环境变量
我们在 Linux 系统下一般通过文件
$HOME/.bashrc
配置自定义环境变量,根据不同的发行版也可能是文件$HOME/.profile
,然后使用 gedit 或 vi 来编辑文件内容。export GOROOT=$HOME/go
为了确保相关文件在文件系统的任何地方都能被调用,你还需要添加以下内容:
export PATH= P A T H : PATH: PATH:GOROOT/bin
在开发 Go 项目时,你还需要一个环境变量来保存你的工作目录。
export GOPATH=$HOME/Applications/Go
$GOPATH
可以包含多个工作目录,取决于你的个人情况。如果你设置了多个工作目录,那么当你在之后使用go get
(远程包安装命令)时远程包将会被安装在第一个目录下。
由于在 1.4 版本后,Go 编译器实现了自举,即通过 1.4 版本来编译安装之后版本的编译器。如果不设置该环境变量的话,会产生这样一个错误Set $GOROOT_BOOTSTRAP to a working Go tree >= Go 1.4.。
所以在安装 Go 1.5 版本及之后的版本时需要设置
cp go/ h o m e / g o − b o o t s t r a p / e x p o r t G O R O O T B O O T S T R A P = home/go-bootstrap/ export GOROOT_BOOTSTRAP= home/go−bootstrap/exportGOROOTBOOTSTRAP=HOME/.golang/go-bootstrap
在完成这些设置后,你需要在终端输入指令
source .bashrc
以使这些环境变量生效。然后重启终端,输入go env
和env
来检查环境变量是否设置正确。 -
安装 C 工具
Go 的工具链是用 C 语言编写的,因此在安装 Go 之前你需要先安装相关的 C 工具。如果你使用的是 Ubuntu 的话,你可以在终端输入以下指令
sudo apt-get install bison ed gawk gcc libc6-dev make
你可以在其它发行版上使用 RPM 之类的工具。
-
获取 Go 源代码
从 官方页面 或 国内镜像 下载 Go 的源码包到你的计算机上,然后将解压后的目录
go
通过命令移动到$GOROOT
所指向的位置。wget https://storage.googleapis.com/golang/go.src.tar.gz
tar -zxvf go.src.tar.gz
sudo mv go $GOROOT -
构建 Go
在终端使用以下指令来进行编译工作。
cd $GOROOT/src
./all.bash注意事项
在测试
net/http
包时有一个测试会尝试连接google.com
,你可能会看到如下所示的一个无厘头的错误报告:‘make[2]: Leaving directory `/localusr/go/src/pkg/net’
如果你正在使用一个带有防火墙的机器,我建议你可以在编译过程中暂时关闭防火墙,以避免不必要的错误。
解决这个问题的另一个办法是通过设置环境变量
$DISABLE_NET_TESTS
来告诉构建工具忽略net/http
包的相关测试:export DISABLE_NET_TESTS=1
如果你完全不想运行包的测试,你可以直接运行
./make.bash
来进行单纯的构建过程。 -
测试安装
使用你最喜爱的编辑器来输入以下内容,并保存为文件名
hello_world1.go
。示例 2.1 hello_world1.go
package main func main() { println("Hello", "world") }
切换相关目录到下,然后执行指令
go run hello_world1.go
,将会打印信息:Hello, world
。 -
验证安装版本
你可以通过在终端输入指令
go version
来打印 Go 的版本信息。如果你想要通过 Go 代码在运行时检测版本,可以通过以下例子实现。
示例 2.2 version.go
package main import ( "fmt" "runtime" ) func main() { fmt.Printf("%s", runtime.Version()) }
这段代码将会输出
go1.4.2
或类似字符串。 -
更新版本
你可以在 发布历史 页面查看到最新的稳定版。
当前最新的稳定版 Go 1 系列于 2012 年 3 月 28 日发布。
Go 的源代码有以下三个分支:
- Go release:最新稳定版,实际开发最佳选择
- Go weekly:包含最近更新的版本,一般每周更新一次
- Go tip:永远保持最新的版本,相当于内测版
当你在使用不同的版本时,注意官方博客发布的信息,因为你所查阅的文档可能和你正在使用的版本不相符。
安装目录清单
你的 Go 安装目录($GOROOT
)的文件夹结构应该如下所示:
README.md, AUTHORS, CONTRIBUTORS, LICENSE
/bin
:包含可执行文件,如:编译器,Go 工具/doc
:包含示例程序,代码工具,本地文档等/lib
:包含文档模版/misc
:包含与支持 Go 编辑器有关的配置文件以及 cgo 的示例/os_arch
:包含标准库的包的对象文件(.a
)/src
:包含源代码构建脚本和标准库的包的完整源代码(Go 是一门开源语言)/src/cmd
:包含 Go 和 C 的编译器和命令行脚本
Go 运行时(runtime)
尽管 Go 编译器产生的是本地可执行代码,这些代码仍旧运行在 Go 的 runtime(这部分的代码可以在 runtime 包中找到)当中。这个 runtime 类似 Java 和 .NET 语言所用到的虚拟机,它负责管理包括内存分配、垃圾回收(第 10.8 节)、栈处理、goroutine、channel、切片(slice)、map 和反射(reflection)等等。
runtime 主要由 C 语言编写(Go 1.5 开始自举),并且是每个 Go 包的最顶级包。你可以在目录 $GOROOT/src/runtime
中找到相关内容。
垃圾回收器 Go 拥有简单却高效的标记-清除回收器。它的主要思想来源于 IBM 的可复用垃圾回收器,旨在打造一个高效、低延迟的并发回收器。目前 gccgo 还没有回收器,同时适用 gc 和 gccgo 的新回收器正在研发中。使用一门具有垃圾回收功能的编程语言不代表你可以避免内存分配所带来的问题,分配和回收内容都是消耗 CPU 资源的一种行为。
Go 的可执行文件都比相对应的源代码文件要大很多,这恰恰说明了 Go 的 runtime 嵌入到了每一个可执行文件当中。当然,在部署到数量巨大的集群时,较大的文件体积也是比较头疼的问题。但总的来说,Go 的部署工作还是要比 Java 和 Python 轻松得多。因为 Go 不需要依赖任何其它文件,它只需要一个单独的静态文件,这样你也不会像使用其它语言一样在各种不同版本的依赖文件之间混淆。
Go 解释器
因为 Go 具有像动态语言那样快速编译的能力,自然而然地就有人会问 Go 语言能否在 REPL(read-eval-print loop)编程环境下实现。Sebastien Binet 已经使用这种环境实现了一个 Go 解释器,你可以在这个页面找到:https://github.com/sbinet/igo。
关于go get 问题
在国内采用go get有时会下载不到一些网站如golang.org的依赖包。例如:
$ go get collidermain
package golang.org/x/net/websocket: unrecognized import path "golang.org/x/net/websocket" (https fetch: Get https://golang.org/x/net/websocket?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
这是因为网络的一些原因,有条件的可以使用VPN,以下方法也可以解决:
1: Gopm(Go Package Manager)
Go Package Manager(gopm)是Go的包管理器和构建工具。
git地址:https://github.com/gpmgo/gopm
官方地址:https://gopm.io/gopm
文档路径:https://github.com/gpmgo/docs/tree/master/zh-CN
通过这个命令可以来安装gopm插件,默认的会存放到GOBIN,如果没有配置%GOBIN%环境变量,那么会默认安装到%GOPATH%下的bin目录,为了我们操作方便,我们把GOBIN加到%PATH%下。
go get -u github.com/gpmgo/gopm
通过gopm get xxx,可以将指定的包下载到gopm的本地仓库~/.gopm/repos(建议使用) 通过’gopm get -g xxx’,可以将指定的包下载到GOPATH下。(建议使用) 通过’gopm get -l xxx’,可以将指定的包下载到当前所在目录(不常用)
用gopm get -g代替go get
不采用-g参数,会把依赖包下载.vendor目录下面;
采用-g 参数,可以把依赖包下载到GOPATH目录中;
2: install form github
golang 在 github 上建立了一个镜像库,如 https://github.com/golang/net 即是 https://golang.org/x/net 的镜像库
获取 golang.org/x/net 包,其实只需要以下步骤:
$ mkdir -p $GOPATH/src/golang.org/x //路径下创建此文件
$ cd $GOPATH/src/golang.org/x //切换到此目录
$ git clone https://github.com/golang/tools.git //通过git安装 tools
$ git clone https://github.com/golang/lint.git //安装 lint
$ go get golang.org/x/lint/golint //然后执行
其它 golang.org/x 下的包获取皆可使用该方法。
例如,很多go的软件在编译时都要使用tools里面的内容,使用下面方法获取:
进入上面的x目录下,输入:
git clone https://github.com/golang/tools.git
注意,一定要保持与go get获取的目录结构是一致的,否则库就找不到了。
3: GOPROXY
主要有两个地址:
https://goproxy.io
https://athens.azurefd.net
命令行设置 例如
goproxy
// bash mac
export GOPROXY=https://goproxy.io
// powershell windows
$env:GOPROXY = "https://goproxy.io"
go moudle
set GO111MODULE=on //windows
export GO111MODULE=on //linux
4. 删除用go get 安装的package
- 手动删除
It's safe to just delete the source directory and compiled package file. Find the source directory under $GOPATH/src and the package file under $GOPATH/pkg/<architecture>, for example: $GOPATH/pkg/windows_amd64.
直接删除源文件目录及编译后的package目录即可。在源码目录 G O P A T H / s r c 下 找 到 你 要 删 除 的 p a c k a g e 名 , 直 接 删 除 ; 然 后 在 GOPATH/src下找到你要删除的package名,直接删除;然后在 GOPATH/src下找到你要删除的package名,直接删除;然后在GOPATH/pkg/下删除编译后的package目标文件目录。
- 用go clean命令自动删除编译后的package目录,再手动删除源文件目录
go get -u github.com/motemen/gore
# -n 表示只打印命令,不执行
go clean -i -n github.com/motemen/gore...
# 执行删除编译后的package目录
go clean -i github.com/motemen/gore...
# 如果还有未删除的目录,那只有手动删除了
$ rmdir $GOPATH/pkg/darwin_amd64/github.com/motemen/gore
$ rm -rf $GOPATH/src/github.com/motemen/gore
注意:
请一定要包含三个点号 ... ,这样就不会递归删除子package,如本例中的 gore/gocode。-i 参数表示删除由 go install 所创建的archive或二进制文档。