十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
Golang也就是Go语言,现在已经发行到1.4.1版本了,语言特性优越性和背后Google强大靠山什么的就不多说了。Golang的官方提供了多个平台上的二进制安装包,遗憾的是并非没有发布ARM平台的二进制安装包。ARM平台没办法直接从官网下载二进制安装包来安装,好在Golang是支持多平台并且开源的语言,因此可以通过直接在ARM平台上编译源代码来安装。整个过程主要包括编译工具配置、获取Golang源代码、设置Golang编译环境变量、编译、配置Golang行环境变量等步骤。
创新互联从2013年开始,先为莱芜等服务建站,莱芜等地企业,进行企业商务咨询服务。为莱芜企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
注:本文选用树莓派做测试,因为树莓派是基于ARM平台的。
1、编译工具配置
据说下个版本的golang编译工具要使用golang自己来写,但目前还是使用C编译工具的。因此,首先要配置好C编译工具:
1.1 在Ubuntu或Debian平台上可以使用sudo apt-get install gcc libc6-dev命令安装,树莓派的RaspBian系统是基于Debian修改的,所以可以使用这种方法安装。
1.2 在RedHat或CentOS 6平台上可以使用sudo yum install gcc libc-devel命令安装。
安装完成后可以输入 gcc --version命令验证是否成功安装。
2、获取golang源代码
2.1 直接从官网下载源代码压缩包。
golang官网提供golang的源代码压缩包,可以直接下载,最新的1.4.1版本源代码链接:
2.2 使用git工具获取。
golang使用git版本管理工具,也可以使用git获取golang源代码。推荐使用这个方法,因为以后可以随时获取最新的golang源代码。
2.2.1 首先确认ARM平台上已经安装了git工具,可以使用git --version命令确认。一般linux平台都安装了git,没有的话可以自行安装,不同平台的安装方法可以参考:
2.2.2 克隆远程golang的git仓库到本地
在终端cd到你想要安装golang的目录,确保该目录下没有名为go的目录。然后以下命令获取代码仓库:
git clone
大陆地区可能会获取失败,在不翻墙的情况下我试了几次都没成功,原因大家都懂的。好在google已经将golang也托管到github上面,所以也可以通过下面命令获取:
git clone
视网络情况,下载可能需要不少时间。我2M的带宽花了将近两个小时才下载完,虽然整个项目不过几十兆= =
下载完成后,可以看到目录下多了一个go目录,里面即为golang的源代码,在终端上执行cd go命令进入该目录。
执行下面命令检出go1.4.1版本的源代码,因为现在已经有新的代码提交上去了,最新的代码可能不是最稳定的:
git checkout go1.4.1
至此,最新1.4.1发行版的源代码获取完毕
3、设置golang的编译环境变量
主要有GOROOT、GOOS、GOARCH、GOARM四个环境变量需要设置,先解释四个环境变量的意义。
3.1 GOROOT
主要代表golang树结构目录的路径,也就是上面git检出的go目录。一般可以不用设置这个环境变量,因为编译的时候默认会以go目录下src子目录中的all.bash脚本运行时的父目录作为GOROOT的值。为了保险起见,可以直接设置为go目录的路径。
3.2 GOOS和GOARCH
分别代表编译的目标系统和平台,可选值如下:
GOOS GOARCH
darwin 386
darwin amd64
dragonfly 386
dragonfly amd64
freebsd 386
freebsd amd64
freebsd arm
linux 386
linux amd64
linux arm
netbsd 386
netbsd amd64
netbsd arm
openbsd 386
openbsd amd64
plan9 386
plan9 amd64
solaris amd64
windows 386
windows amd64
需要注意的是这两个值代表的是目标系统和平台,而不是编译源代码的系统和平台。树莓派的RaspBian是linux系统,所以这些GOOS设置为linux,GOARCH设置为arm。
3.3 GOARM
表示使用的浮点运算协处理器版本号,只对arm平台有用,可选值有5,6,7。如果是在目标平台上编译源代码,这个值可以不设置,它会自动判断需要使用哪一个版本。
总结下来,在树莓派上设置golang的编译环境变量,可编辑$HOME/.bashrc文件,在末尾添加下面内容:
export GOROOT=你的go目录路径
export GOOS=linux
export GOARCH=arm
编辑完后保存,执行source ~/.bashrc命令让修改生效。
4、编译源代码
环境变量配置完成自后就可以开始编译源代码。在go目录下的src子目录中,主要有all.bash和make.bash两个脚本(另外还有两个all.bat和make.bat脚本适用于window平台)。编译实际上就是执行其中一个脚本,两者的区别在于all.bash在编译完成后还会执行一些测试套件。如果希望只编译不测试,可以运行make.bash脚本。使用cd命令进入go下src目录,执行./all.bash或者./make.bash命令即可开始编译。由于硬件情况不同,编译耗费的时间不同。在我的B型树莓派编译过程花费了将近半个小时,编译完成后执行的测试套件又花费了差不多一个小时,总共花费了一个半小时左右。
5、配置golang运行环境变量
编译完成后,go目录下会生成bin目录,里面就是go的运行脚本。为了以后使用方法,可以将这个bin路径添加到PATH环境变量中。同样编辑~/.bashrc文件,因为前面设置过GOROOT环境变量指向go目录了,所以只需要在末尾加上
export PATH=$PATH:$GOROOT/bin
保存后同样执行source ~/.bashrc命令让环境变量生效。
至此,golang源代码编译安装成功。执行go version应该就能看到当前golang的版本信息,表示编译安装成功。
Go语言在Centos下的安装:
注意,以下命令需要以root身份,或者sudo运行。
说明,如果要自定义安装位置的话,需要配置GOROOT环境变量,所以这里我们采用默认的目录进行安装,就可以不配置GOROOT环境变量了。
首先去官网下载go的安装包,这里用的是:go1.5.1.linux-amd64.tar.gz
■ 1,选择安装路径
由于默认的go路径,在/usr/local下, 所以用如下命令,解压创建/usr/local/go
tar -C /usr/local -xzf go1.5.1.linux-amd64.tar.gz
■ 2,添加PATH环境变量
vi /etc/profile
然后加入下面这行:
export PATH=$PATH:/usr/local/go/bin
■ 3,建立Go的工作空间(workspace,也就是GOPATH环境变量指向的目录)
GO代码必须在工作空间内。工作空间是一个目录,其中包含三个子目录:
src ---- 里面每一个子目录,就是一个包。包内是Go的源码文件
pkg ---- 编译后生成的,包的目标文件
bin ---- 生成的可执行文件。
这里,我们在/home目录下, 建立一个名为gopath(可以不是gopath, 任意名字都可以)的文件夹,
然后再建立三个子文件夹(子文件夹名必须为src、pkg、bin)。如下图:
■ 4,设置GOPATH环境变量
vi /etc/profile
然后加入下面这行:
export GOPATH=/home/gopath
保存后,执行以下命令,使环境变量立即生效:
source /etc/profile
至此,Go语言的环境已经安装完毕。下面开始 HelloWorld
具体步骤:
1、去官网下载go1.1.2的tarball,一般下载到tem目录
2、打开终端cd /usr/local, tar -zxvf go1.1.2.linux-386.tar.gz
将源码文件解压缩到/usr/local目录,如果解压到其他目录,需要自己设置GOROOT
3、安装gcc工具,因为golang有些功能是使用c写
sudo apt-get install bison gawk gcc libc6-dev make
4、$ cd go/src,$ ./all.bash
运行bash脚本,如果运行正常会获得你的操作系统和cpu信息,自动编译安装
5、将export PATH=$PATH:/usr/local/go/bin 写入$HOME/.profile
最后进行测试输入go version 会显示go1.1.2 linux/386
一、Go安装使用
1、下载Go源码包
上传到/usr/local/src目录下
2、编译安装Go到/usr/local
tar zxvf go1.6.3.linux-amd64.tar.gz -C /usr/local/
#注:必须使用root账户或者使用sudo来解压缩Go源码包
3、设置PATH环境变量,添加/usr/local/go/bin到环境变量
export PATH=$PATH:/usr/local/go/bin
4、安装到自定义位置
Go二进制文件默认安装到/usr/local/go,但是可以安装Go工具到不同的位置,可以自行定义,只需要设置正确的环境变量。
例如,安装Go到家目录下,必须添加环境变量到$HOME/.profile
export GOROOT=$HOME/go
export PATH=$PATH:$GOROOT/bin
注:安装Go到其他目录时,GOROOT必须设置为环境变量
5、检查是否正确安装程序
通过设置一个工作区和建立一个简单的程序,检查是否正确安装了一个简单的程序。创建一个目录包含您的工作空间,例如/data/work,并设置GOPATH环境变量指向的位置。
export GOPATH=/data/work
#如果不存在/data/work,需要新建
然后,在你的工作内创建src/github点抗 /user/hello,如果使用github,可以使用自己的用户名代替user,在hello目录下,新建hello.go
# cat hello.go
package main
import "fmt"
func main {
fmt.Printf("hello,world!\n")
}
#使用go编译hello.go
go install github点抗 /user/hello
#上面的命令讲名叫hello(or hello.exe)的程序放到你的工作区内,执行下面命令,会得到输出结果。
$GOPATH/bin/hello
hello,world!
#当出现hello,world!表明Go已经安装成功可以工作。
二、Go工作区介绍
1、机构组织代码概述
Go语言程序通常将所有的代码保存在一个工作区中。
工作区包含许多版本控制库(由Git管理)。
每个存储库包含一个或多个包。
每个包由一个或多个在一个目录中的源文件组成。
一个包的目录的路径决定其导入路径。
注:同于其他的编程环境中,每一个项目都有一个独立的工作区且工作区是紧密联系在一起的版本控制库。
2、工作区介绍
工作区是一个目录层次结构,它的根目录有三个目录:
src 包含Go源文件
pkg 包含对象和包
bin 包含可执行命令
Go工具创建源码包并安装二进制文件到pkg和bin目录下
src目录通常包含多个版本控制库(如Git或Mercurial),跟踪一个或多个源包的开发。
下面展示一个好的工作区的例子:
bin/
hello # command executable
outyet # command executable
pkg/
linux_amd64/
github点抗 /golang/example/
stringutil.a # package object
src/
github点抗 /golang/example/
.git/ # Git repository metadata
hello/
hello.go # command source
outyet/
main.go # command source
main_test.go # test source
stringutil/
reverse.go # package source
reverse_test.go # test source
golang.org/x/image/
.git/ # Git repository metadata
bmp/
reader.go # package source
writer.go # package source
... (many more repositories and packages omitted) ...
上面的属性图展示了一个包含两个存储库(example和image)的工作区,example 存储库包含两个命令(hello,outyet),image库包含bmp包和几个其他的包。
一个典型的工作区包含包含许多软件包和命令的多个源库。大多数程序员将所有的源代码和依赖关系保存在一个工作区中
3、GOPATH环境变量设置
GOPATH环境变量指定工作区的位置。它很可能是唯一的环境变量,代码开发时需要设置。
开始,创建一个工作区目录并设置相应的gopath。您的工作区可以位于任何你喜欢的地方,但我们将在这个文档中使用/data/work。请注意,这不能是您的“Go安装”路径相同。
mkdir -p /data/work
export GOPATH=/data/work
为了方便。添加工作区的bin到PATH中
export PATH=$PATH:$GOPATH/bin
4、导入路径
一个导入路径是唯一标识一个包的字符串。一个包的导入路径对应于它在工作区内或远程存储库中的位置。
从标准库的软件包中给出了短的导入路径等。对于您自己的包,您必须选择不可能和未来添加到标准库或其他外部库的基础路径冲突的路径。
注意,你不需要将你的代码发布到一个远程存储库之前,你可以建立它。这只是一个很好的习惯来组织你的代码,如果你有一天会出版它。在实践中,你可以选择任何任意的路径名称,只要它是唯一的标准库和更大的去生态系统。
我们将使用github点抗 /user作为我们的基本路径。在您的工作区中创建一个目录,以保持源代码:
mkdir -p $GOPATH/src/github点抗 /user
5、第一个项目
编译并运行一个简单的程序,首先选择一个包的路径(我们将使用github点抗 /user/hello)和创建在您的工作区相应的软件包目录:
mkdir $GOPATH/src/github点抗 /user/hello
创建名叫hello.go的文件,上面创建过,此处略过。
cd $GOPATH/src/github点抗 /user/hello
go install
$GOPATH/bin/hello
或者:
hello
如果你使用的是一个源代码管理系统,现在是一个很好的时间来初始化一个存储库,添加文件,并提交你的第一次更改。再次,这一步是可选的:您不需要使用源代码管理来写代码。
cd $GOPATH/src/github点抗 /user/hello
git init
Initialized empty Git repository in /data/work/src/github点抗 /user/hello/.git/
git add hello.go
git commit -m "first commit"
[master (root-commit) bbfb477] first commit
6、first library
mkdir $GOPATH/src/github点抗 /user/stringutil
下一步,在目录下创建一个名为reverse.go文件中有下列内容:
// Package stringutil contains utility functions for working with strings.
package stringutil
// Reverse returns its argument string reversed rune-wise left to right.
func Reverse(s string) string {
r := []rune(s)
for i, j := 0, len(r)-1; i len(r)/2; i, j = i+1, j-1 {
r[i], r[j] = r[j], r[i]
}
return string(r)
}
使用go build测试包的编译
$ go build github点抗 /user/stringutil
如果当前位置源码包目录,只需要:
go build
上面操作并不会产生一个输出文件,必须使用go install,把包和对象输出到工作去的pkg目录内
确认stringutil包创建完成后,修改原始hello.go,使用stringutil包:
package main
import (
"fmt"
"github点抗 /user/stringutil"
)
func main() {
fmt.Printf(stringutil.Reverse("\n !oG ,olleH"))
}
无论使用go安装包还是二进制文件,所有相关的依赖都会自动安装。所以当你安装hello程序时:
$ go install github点抗 /user/hello
对应的stringutil包会自动安装好。
执行新的hello程序,可以看到消息已经被反转
# hello
Hello, Go!
完成上面操作之后,工作区应该为:
├── bin
│ └── hello # command executable
├── pkg
│ └── linux_amd64 # this will reflect your OS and architecture
│ └── github点抗
│ └── user
│ └── stringutil.a # package object
└── src
└── github点抗
└── user
├── hello
│ └── hello.go # command source
└── stringutil
└── reverse.go # package source
注意:go install会把库文件stringutil.a放到pkg/linux_amd64下边(目录结构跟源代码结构一样)。这样可以go命令可以直接找到对应的包对象,避免不必要的重复编译。linux_amd64是为了根据操作系统和你的系统架构交叉编译。
所有Go可执行程序都通过静态方式链接在一起,所以在运行时是不需要相关的包对象(库)。
7、包命令
所有的Go源代码都以下面的语句开始:
package name
其中name就是包引用默认的名称,一个包中的所有文件必须使用同一个包名,可执行命令必须是main。
一个二进制文件下所有的包名不需要唯一,但是引用路径必须唯一
8、测试
Go自带了一个轻量级的测试框架,由go test和testing包组成。
可以通过新建xx_test.go写一个测试,其中包含若干个TestXXX函数。测试框架会自动执行这些函数;如果函数中包含tError或t.Fail, 对应的测试会被判为失败。
添加一个针对stringutil的测试文件$GOPATH/src/github点抗 /user/stringutil/reverse_test.go,包含以下内容:
package stringutil
import "testing"
func TestReverse(t *testing.T) {
cases := []struct {
in, want string
}{
{"Hello, world", "dlrow ,olleH"},
{"Hello, 世界", "界世,olleH"},
{"", ""},
}
for _, c := range cases {
got := Reverse(c.in)
if got != c.want {
t.Errorf("Reverse(%q) == %q, want %q", c.in, got, c.want)
}
}
}
#通过go test测试
# go test github点抗 /user/stringutil
ok github点抗 /user/stringutil 0.002s
#同样的,在包文件夹下可以忽略路径而直接执行go test
[root@zabbix stringutil]# go test
PASS
ok github点抗 /user/stringutil 0.002s
9、远程包
包的引用路径用来描述如何通过版本控制系统获取包的源代码。go工具通过引用路径自动从远程代码仓库获取包文件。比如本文中用的例子也对应的保存在github点抗 /golang/example下。go可以通过包的代码仓库的url直接获取、生成、安装对应的包。
[root@zabbix ~]# go get github点抗 /golang/example/hello
[root@zabbix ~]# $GOPATH/bin/hello
Hello, Go examples!
如果工作区中不存在对应的包,go会将对应的包放到GOPATH环境变量指明的工作区下。(如果包已经存在,go跳过代码拉去而直接执行go install)
建议详细看一下这个,有图文