一、Go安裝使用
創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括南木林網(wǎng)站建設(shè)、南木林網(wǎng)站制作、南木林網(wǎng)頁制作以及南木林網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,南木林網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到南木林省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
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、設(shè)置PATH環(huán)境變量,添加/usr/local/go/bin到環(huán)境變量
export PATH=$PATH:/usr/local/go/bin
4、安裝到自定義位置
Go二進(jìn)制文件默認(rèn)安裝到/usr/local/go,但是可以安裝Go工具到不同的位置,可以自行定義,只需要設(shè)置正確的環(huán)境變量。
例如,安裝Go到家目錄下,必須添加環(huán)境變量到$HOME/.profile
export GOROOT=$HOME/go
export PATH=$PATH:$GOROOT/bin
注:安裝Go到其他目錄時(shí),GOROOT必須設(shè)置為環(huán)境變量
5、檢查是否正確安裝程序
通過設(shè)置一個(gè)工作區(qū)和建立一個(gè)簡單的程序,檢查是否正確安裝了一個(gè)簡單的程序。創(chuàng)建一個(gè)目錄包含您的工作空間,例如/data/work,并設(shè)置GOPATH環(huán)境變量指向的位置。
export GOPATH=/data/work
#如果不存在/data/work,需要新建
然后,在你的工作內(nèi)創(chuàng)建src/github.com/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.com/user/hello
#上面的命令講名叫hello(or hello.exe)的程序放到你的工作區(qū)內(nèi),執(zhí)行下面命令,會(huì)得到輸出結(jié)果。
$GOPATH/bin/hello
hello,world!
#當(dāng)出現(xiàn)hello,world!表明Go已經(jīng)安裝成功可以工作。
二、Go工作區(qū)介紹
1、機(jī)構(gòu)組織代碼概述
Go語言程序通常將所有的代碼保存在一個(gè)工作區(qū)中。
工作區(qū)包含許多版本控制庫(由Git管理)。
每個(gè)存儲(chǔ)庫包含一個(gè)或多個(gè)包。
每個(gè)包由一個(gè)或多個(gè)在一個(gè)目錄中的源文件組成。
一個(gè)包的目錄的路徑?jīng)Q定其導(dǎo)入路徑。
注:同于其他的編程環(huán)境中,每一個(gè)項(xiàng)目都有一個(gè)獨(dú)立的工作區(qū)且工作區(qū)是緊密聯(lián)系在一起的版本控制庫。
2、工作區(qū)介紹
工作區(qū)是一個(gè)目錄層次結(jié)構(gòu),它的根目錄有三個(gè)目錄:
src 包含Go源文件
pkg 包含對(duì)象和包
bin 包含可執(zhí)行命令
Go工具創(chuàng)建源碼包并安裝二進(jìn)制文件到pkg和bin目錄下
src目錄通常包含多個(gè)版本控制庫(如Git或Mercurial),跟蹤一個(gè)或多個(gè)源包的開發(fā)。
下面展示一個(gè)好的工作區(qū)的例子:
bin/
hello # command executable
outyet # command executable
pkg/
linux_amd64/
github.com/golang/example/
stringutil.a # package object
src/
github.com/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) ...
上面的屬性圖展示了一個(gè)包含兩個(gè)存儲(chǔ)庫(example和image)的工作區(qū),example 存儲(chǔ)庫包含兩個(gè)命令(hello,outyet),image庫包含bmp包和幾個(gè)其他的包。
一個(gè)典型的工作區(qū)包含包含許多軟件包和命令的多個(gè)源庫。大多數(shù)程序員將所有的源代碼和依賴關(guān)系保存在一個(gè)工作區(qū)中
3、GOPATH環(huán)境變量設(shè)置
GOPATH環(huán)境變量指定工作區(qū)的位置。它很可能是唯一的環(huán)境變量,代碼開發(fā)時(shí)需要設(shè)置。
開始,創(chuàng)建一個(gè)工作區(qū)目錄并設(shè)置相應(yīng)的gopath。您的工作區(qū)可以位于任何你喜歡的地方,但我們將在這個(gè)文檔中使用/data/work。請注意,這不能是您的“Go安裝”路徑相同。
mkdir -p /data/work
export GOPATH=/data/work
為了方便。添加工作區(qū)的bin到PATH中
export PATH=$PATH:$GOPATH/bin
4、導(dǎo)入路徑
一個(gè)導(dǎo)入路徑是唯一標(biāo)識(shí)一個(gè)包的字符串。一個(gè)包的導(dǎo)入路徑對(duì)應(yīng)于它在工作區(qū)內(nèi)或遠(yuǎn)程存儲(chǔ)庫中的位置。
從標(biāo)準(zhǔn)庫的軟件包中給出了短的導(dǎo)入路徑等。對(duì)于您自己的包,您必須選擇不可能和未來添加到標(biāo)準(zhǔn)庫或其他外部庫的基礎(chǔ)路徑?jīng)_突的路徑。
注意,你不需要將你的代碼發(fā)布到一個(gè)遠(yuǎn)程存儲(chǔ)庫之前,你可以建立它。這只是一個(gè)很好的習(xí)慣來組織你的代碼,如果你有一天會(huì)出版它。在實(shí)踐中,你可以選擇任何任意的路徑名稱,只要它是唯一的標(biāo)準(zhǔn)庫和更大的去生態(tài)系統(tǒng)。
我們將使用github.com/user作為我們的基本路徑。在您的工作區(qū)中創(chuàng)建一個(gè)目錄,以保持源代碼:
mkdir -p $GOPATH/src/github.com/user
5、第一個(gè)項(xiàng)目
編譯并運(yùn)行一個(gè)簡單的程序,首先選擇一個(gè)包的路徑(我們將使用github.com/user/hello)和創(chuàng)建在您的工作區(qū)相應(yīng)的軟件包目錄:
mkdir $GOPATH/src/github.com/user/hello
創(chuàng)建名叫hello.go的文件,上面創(chuàng)建過,此處略過。
cd $GOPATH/src/github.com/user/hello
go install
$GOPATH/bin/hello
或者:
hello
如果你使用的是一個(gè)源代碼管理系統(tǒng),現(xiàn)在是一個(gè)很好的時(shí)間來初始化一個(gè)存儲(chǔ)庫,添加文件,并提交你的第一次更改。再次,這一步是可選的:您不需要使用源代碼管理來寫代碼。
cd $GOPATH/src/github.com/user/hello
git init
Initialized empty Git repository in /data/work/src/github.com/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.com/user/stringutil
下一步,在目錄下創(chuàng)建一個(gè)名為reverse.go文件中有下列內(nèi)容:
// 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.com/user/stringutil
如果當(dāng)前位置源碼包目錄,只需要:
go build
上面操作并不會(huì)產(chǎn)生一個(gè)輸出文件,必須使用go install,把包和對(duì)象輸出到工作去的pkg目錄內(nèi)
確認(rèn)stringutil包創(chuàng)建完成后,修改原始hello.go,使用stringutil包:
package main
import (
"fmt"
"github.com/user/stringutil"
)
func main() {
fmt.Printf(stringutil.Reverse("\n !oG ,olleH"))
}
無論使用go安裝包還是二進(jìn)制文件,所有相關(guān)的依賴都會(huì)自動(dòng)安裝。所以當(dāng)你安裝hello程序時(shí):
$ go install github.com/user/hello
對(duì)應(yīng)的stringutil包會(huì)自動(dòng)安裝好。
執(zhí)行新的hello程序,可以看到消息已經(jīng)被反轉(zhuǎn)
# hello
Hello, Go!
完成上面操作之后,工作區(qū)應(yīng)該為:
├── bin
│ └── hello # command executable
├── pkg
│ └── linux_amd64 # this will reflect your OS and architecture
│ └── github.com
│ └── user
│ └── stringutil.a # package object
└── src
└── github.com
└── user
├── hello
│ └── hello.go # command source
└── stringutil
└── reverse.go # package source
注意:go install會(huì)把庫文件stringutil.a放到pkg/linux_amd64下邊(目錄結(jié)構(gòu)跟源代碼結(jié)構(gòu)一樣)。這樣可以go命令可以直接找到對(duì)應(yīng)的包對(duì)象,避免不必要的重復(fù)編譯。linux_amd64是為了根據(jù)操作系統(tǒng)和你的系統(tǒng)架構(gòu)交叉編譯。
所有Go可執(zhí)行程序都通過靜態(tài)方式鏈接在一起,所以在運(yùn)行時(shí)是不需要相關(guān)的包對(duì)象(庫)。
7、包命令
所有的Go源代碼都以下面的語句開始:
package name
其中name就是包引用默認(rèn)的名稱,一個(gè)包中的所有文件必須使用同一個(gè)包名,可執(zhí)行命令必須是main。
一個(gè)二進(jìn)制文件下所有的包名不需要唯一,但是引用路徑必須唯一
8、測試
Go自帶了一個(gè)輕量級(jí)的測試框架,由go test和testing包組成。
可以通過新建xx_test.go寫一個(gè)測試,其中包含若干個(gè)TestXXX函數(shù)。測試框架會(huì)自動(dòng)執(zhí)行這些函數(shù);如果函數(shù)中包含tError或t.Fail, 對(duì)應(yīng)的測試會(huì)被判為失敗。
添加一個(gè)針對(duì)stringutil的測試文件$GOPATH/src/github.com/user/stringutil/reverse_test.go,包含以下內(nèi)容:
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.com/user/stringutil
ok github.com/user/stringutil 0.002s
#同樣的,在包文件夾下可以忽略路徑而直接執(zhí)行g(shù)o test
[root@zabbix stringutil]# go test
PASS
ok github.com/user/stringutil 0.002s
9、遠(yuǎn)程包
包的引用路徑用來描述如何通過版本控制系統(tǒng)獲取包的源代碼。go工具通過引用路徑自動(dòng)從遠(yuǎn)程代碼倉庫獲取包文件。比如本文中用的例子也對(duì)應(yīng)的保存在github.com/golang/example下。go可以通過包的代碼倉庫的url直接獲取、生成、安裝對(duì)應(yīng)的包。
[root@zabbix ~]# go get github.com/golang/example/hello
[root@zabbix ~]# $GOPATH/bin/hello
Hello, Go examples!
如果工作區(qū)中不存在對(duì)應(yīng)的包,go會(huì)將對(duì)應(yīng)的包放到GOPATH環(huán)境變量指明的工作區(qū)下。(如果包已經(jīng)存在,go跳過代碼拉去而直接執(zhí)行g(shù)o install)
建議詳細(xì)看一下這個(gè),有圖文
Golang也就是Go語言,現(xiàn)在已經(jīng)發(fā)行到1.4.1版本了,語言特性優(yōu)越性和背后Google強(qiáng)大靠山什么的就不多說了。Golang的官方提供了多個(gè)平臺(tái)上的二進(jìn)制安裝包,遺憾的是并非沒有發(fā)布ARM平臺(tái)的二進(jìn)制安裝包。ARM平臺(tái)沒辦法直接從官網(wǎng)下載二進(jìn)制安裝包來安裝,好在Golang是支持多平臺(tái)并且開源的語言,因此可以通過直接在ARM平臺(tái)上編譯源代碼來安裝。整個(gè)過程主要包括編譯工具配置、獲取Golang源代碼、設(shè)置Golang編譯環(huán)境變量、編譯、配置Golang行環(huán)境變量等步驟。
注:本文選用樹莓派做測試,因?yàn)闃漭墒腔贏RM平臺(tái)的。
1、編譯工具配置
據(jù)說下個(gè)版本的golang編譯工具要使用golang自己來寫,但目前還是使用C編譯工具的。因此,首先要配置好C編譯工具:
1.1 在Ubuntu或Debian平臺(tái)上可以使用sudo apt-get install gcc libc6-dev命令安裝,樹莓派的RaspBian系統(tǒng)是基于Debian修改的,所以可以使用這種方法安裝。
1.2 在RedHat或CentOS 6平臺(tái)上可以使用sudo yum install gcc libc-devel命令安裝。
安裝完成后可以輸入 gcc --version命令驗(yàn)證是否成功安裝。
2、獲取golang源代碼
2.1 直接從官網(wǎng)下載源代碼壓縮包。
golang官網(wǎng)提供golang的源代碼壓縮包,可以直接下載,最新的1.4.1版本源代碼鏈接:
2.2 使用git工具獲取。
golang使用git版本管理工具,也可以使用git獲取golang源代碼。推薦使用這個(gè)方法,因?yàn)橐院罂梢噪S時(shí)獲取最新的golang源代碼。
2.2.1 首先確認(rèn)ARM平臺(tái)上已經(jīng)安裝了git工具,可以使用git --version命令確認(rèn)。一般linux平臺(tái)都安裝了git,沒有的話可以自行安裝,不同平臺(tái)的安裝方法可以參考:
2.2.2 克隆遠(yuǎn)程golang的git倉庫到本地
在終端cd到你想要安裝golang的目錄,確保該目錄下沒有名為go的目錄。然后以下命令獲取代碼倉庫:
git clone
大陸地區(qū)可能會(huì)獲取失敗,在不翻墻的情況下我試了幾次都沒成功,原因大家都懂的。好在google已經(jīng)將golang也托管到github上面,所以也可以通過下面命令獲?。?/p>
git clone
視網(wǎng)絡(luò)情況,下載可能需要不少時(shí)間。我2M的帶寬花了將近兩個(gè)小時(shí)才下載完,雖然整個(gè)項(xiàng)目不過幾十兆= =
下載完成后,可以看到目錄下多了一個(gè)go目錄,里面即為golang的源代碼,在終端上執(zhí)行cd go命令進(jìn)入該目錄。
執(zhí)行下面命令檢出go1.4.1版本的源代碼,因?yàn)楝F(xiàn)在已經(jīng)有新的代碼提交上去了,最新的代碼可能不是最穩(wěn)定的:
git checkout go1.4.1
至此,最新1.4.1發(fā)行版的源代碼獲取完畢
3、設(shè)置golang的編譯環(huán)境變量
主要有GOROOT、GOOS、GOARCH、GOARM四個(gè)環(huán)境變量需要設(shè)置,先解釋四個(gè)環(huán)境變量的意義。
3.1 GOROOT
主要代表golang樹結(jié)構(gòu)目錄的路徑,也就是上面git檢出的go目錄。一般可以不用設(shè)置這個(gè)環(huán)境變量,因?yàn)榫幾g的時(shí)候默認(rèn)會(huì)以go目錄下src子目錄中的all.bash腳本運(yùn)行時(shí)的父目錄作為GOROOT的值。為了保險(xiǎn)起見,可以直接設(shè)置為go目錄的路徑。
3.2 GOOS和GOARCH
分別代表編譯的目標(biāo)系統(tǒng)和平臺(tái),可選值如下:
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
需要注意的是這兩個(gè)值代表的是目標(biāo)系統(tǒng)和平臺(tái),而不是編譯源代碼的系統(tǒng)和平臺(tái)。樹莓派的RaspBian是linux系統(tǒng),所以這些GOOS設(shè)置為linux,GOARCH設(shè)置為arm。
3.3 GOARM
表示使用的浮點(diǎn)運(yùn)算協(xié)處理器版本號(hào),只對(duì)arm平臺(tái)有用,可選值有5,6,7。如果是在目標(biāo)平臺(tái)上編譯源代碼,這個(gè)值可以不設(shè)置,它會(huì)自動(dòng)判斷需要使用哪一個(gè)版本。
總結(jié)下來,在樹莓派上設(shè)置golang的編譯環(huán)境變量,可編輯$HOME/.bashrc文件,在末尾添加下面內(nèi)容:
export GOROOT=你的go目錄路徑
export GOOS=linux
export GOARCH=arm
編輯完后保存,執(zhí)行source ~/.bashrc命令讓修改生效。
4、編譯源代碼
環(huán)境變量配置完成自后就可以開始編譯源代碼。在go目錄下的src子目錄中,主要有all.bash和make.bash兩個(gè)腳本(另外還有兩個(gè)all.bat和make.bat腳本適用于window平臺(tái))。編譯實(shí)際上就是執(zhí)行其中一個(gè)腳本,兩者的區(qū)別在于all.bash在編譯完成后還會(huì)執(zhí)行一些測試套件。如果希望只編譯不測試,可以運(yùn)行make.bash腳本。使用cd命令進(jìn)入go下src目錄,執(zhí)行./all.bash或者./make.bash命令即可開始編譯。由于硬件情況不同,編譯耗費(fèi)的時(shí)間不同。在我的B型樹莓派編譯過程花費(fèi)了將近半個(gè)小時(shí),編譯完成后執(zhí)行的測試套件又花費(fèi)了差不多一個(gè)小時(shí),總共花費(fèi)了一個(gè)半小時(shí)左右。
5、配置golang運(yùn)行環(huán)境變量
編譯完成后,go目錄下會(huì)生成bin目錄,里面就是go的運(yùn)行腳本。為了以后使用方法,可以將這個(gè)bin路徑添加到PATH環(huán)境變量中。同樣編輯~/.bashrc文件,因?yàn)榍懊嬖O(shè)置過GOROOT環(huán)境變量指向go目錄了,所以只需要在末尾加上
export PATH=$PATH:$GOROOT/bin
保存后同樣執(zhí)行source ~/.bashrc命令讓環(huán)境變量生效。
至此,golang源代碼編譯安裝成功。執(zhí)行g(shù)o version應(yīng)該就能看到當(dāng)前golang的版本信息,表示編譯安裝成功。
Go語言又稱為golang,是由Google最初開發(fā)的一種開源編程語言,其在設(shè)計(jì)時(shí)就遵循了簡單、安全和速度的3大原則。Go語言具有多種調(diào)試、測試、分析和代碼審查工具,如今Go語言和工具已在大多數(shù)Linux發(fā)行版本的源庫中進(jìn)行提供,本文介紹如何為Linux安裝Go語言。
在命令行執(zhí)行如下指令
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build main.go? //開始編譯程序