Go語言的GOPATH與工作目錄詳解
GOPATH設(shè)置
go 命令依賴一個(gè)重要的環(huán)境變量:$GOPATH1
(注:這個(gè)不是Go安裝目錄。下面以筆者的工作目錄為說明,請(qǐng)?zhí)鎿Q自己機(jī)器上的工作目錄。)
在類似 Unix 環(huán)境大概這樣設(shè)置:
export GOPATH=/home/apple/mygo
為了方便,應(yīng)該把新建以上文件夾,并且把以上一行加入到 .bashrc 或者 .zshrc 或者自己的 sh 的配置文件中。
Windows 設(shè)置如下,新建一個(gè)環(huán)境變量名稱叫做GOPATH:
GOPATH=c:\mygo
GOPATH允許多個(gè)目錄,當(dāng)有多個(gè)目錄時(shí),請(qǐng)注意分隔符,多個(gè)目錄的時(shí)候Windows是分號(hào),Linux系統(tǒng)是冒號(hào),當(dāng)有多個(gè)GOPATH時(shí),默認(rèn)會(huì)將go get的內(nèi)容放在第一個(gè)目錄下
以上 $GOPATH 目錄約定有三個(gè)子目錄:
1.src 存放源代碼(比如:.go .c .h .s等)
2.pkg 編譯后生成的文件(比如:.a)
3.bin 編譯后生成的可執(zhí)行文件(為了方便,可以把此目錄加入到 $PATH 變量中,如果有多個(gè)gopath,那么使用${GOPATH//://bin:}/bin添加所有的bin目錄)
以后我所有的例子都是以mygo作為我的gopath目錄
應(yīng)用目錄結(jié)構(gòu)
建立包和目錄:$GOPATH/src/mymath/sqrt.go(包名:"mymath")
以后自己新建應(yīng)用或者一個(gè)代碼包都是在src目錄下新建一個(gè)文件夾,文件夾名稱一般是代碼包名稱,當(dāng)然也允許多級(jí)目錄,例如在src下面新建了目錄$GOPATH/src/github.com/astaxie/beedb 那么這個(gè)包路徑就是“github.com/astaxie/beedb”,包名稱是最后一個(gè)目錄beedb
執(zhí)行如下代碼:
cd $GOPATH/src
mkdir mymath
新建文件sqrt.go,內(nèi)容如下:
// $GOPATH/src/mymath/sqrt.go源碼如下:
package mymath
func Sqrt(x float64) float64 {
z := 0.0
for i := 0; i < 1000; i++ {
z -= (z*z - x) / (2 * x)
}
return z
}
這樣我的應(yīng)用包目錄和代碼已經(jīng)新建完畢,注意:一般建議package的名稱和目錄名保持一致
編譯應(yīng)用
上面我們已經(jīng)建立了自己的應(yīng)用包,如何進(jìn)行編譯安裝呢?有兩種方式可以進(jìn)行安裝
1、只要進(jìn)入對(duì)應(yīng)的應(yīng)用包目錄,然后執(zhí)行g(shù)o install,就可以安裝了
2、在任意的目錄執(zhí)行如下代碼go install mymath
安裝完之后,我們可以進(jìn)入如下目錄:
cd $GOPATH/pkg/${GOOS}_${GOARCH}
//可以看到如下文件
mymath.a
這個(gè).a文件是應(yīng)用包,那么我們?nèi)绾芜M(jìn)行調(diào)用呢?
接下來我們新建一個(gè)應(yīng)用程序來調(diào)用
新建應(yīng)用包mathapp:
cd $GOPATH/src
mkdir mathapp
cd mathapp
vim main.go
// $GOPATH/src/mathapp/main.go源碼:
package main
import (
"mymath"
"fmt"
)
func main() {
fmt.Printf("Hello, world. Sqrt(2) = %v\n", mymath.Sqrt(2))
}
如何編譯程序呢?進(jìn)入該應(yīng)用目錄,然后執(zhí)行g(shù)o build,那么在該目錄下面會(huì)生成一個(gè)mathapp的可執(zhí)行文件
./mathapp
輸出如下內(nèi)容
Hello, world. Sqrt(2) = 1.414213562373095
如何安裝該應(yīng)用,進(jìn)入該目錄執(zhí)行g(shù)o install,那么在$GOPATH/bin/下增加了一個(gè)可執(zhí)行文件mathapp,這樣可以在命令行輸入如下命令就可以執(zhí)行
mathapp
也是輸出如下內(nèi)容
Hello, world. Sqrt(2) = 1.414213562373095
獲取遠(yuǎn)程包
go語言有一個(gè)獲取遠(yuǎn)程包的工具就是go get,目前go get支持多數(shù)開源社區(qū)(例如:github、googlecode、bitbucket、Launchpad)
go get github.com/astaxie/beedb
go get -u 參數(shù)可以自動(dòng)更新包,而且當(dāng)go get的時(shí)候會(huì)自動(dòng)獲取該包依賴的其他第三方包
通過這個(gè)命令可以獲取相應(yīng)的源碼,對(duì)應(yīng)的開源平臺(tái)采用不同的源碼控制工具,例如github采用git、googlecode采用hg,所以要想獲取這些源碼,必須先安裝相應(yīng)的源碼控制工具
通過上面獲取的代碼在我們本地的源碼相應(yīng)的代碼結(jié)構(gòu)如下:
$GOPATH
src
|--github.com
|-astaxie
|-beedb
pkg
|--相應(yīng)平臺(tái)
|-github.com
|--astaxie
|beedb.a
go get本質(zhì)上可以理解為首先第一步是通過源碼工具clone代碼到src下面,然后執(zhí)行g(shù)o install
在代碼中如何使用遠(yuǎn)程包,很簡(jiǎn)單的就是和使用本地包一樣,只要在開頭import相應(yīng)的路徑就可以
import "github.com/astaxie/beedb"
程序的整體結(jié)構(gòu)
通過上面建立的我本地的mygo的目錄結(jié)構(gòu)如下所示
bin/
mathapp
pkg/
平臺(tái)名/ 如:darwin_amd64、linux_amd64
mymath.a
github.com/
astaxie/
beedb.a
src/
mathapp
main.go
mymath/
sqrt.go
github.com/
astaxie/
beedb/
beedb.go
util.go
從上面的結(jié)構(gòu)我們可以很清晰的看到,bin目錄下面存的是編譯之后可執(zhí)行的文件,pkg下面存放的是函數(shù)包,src下面保存的是應(yīng)用源代碼。
[1] Windows系統(tǒng)中環(huán)境變量的形式為%GOPATH%,本書主要使用Unix形式,Windows用戶請(qǐng)自行替換。
相關(guān)文章
Go 結(jié)構(gòu)體、數(shù)組、字典和 json 字符串的相互轉(zhuǎn)換方法
今天小編就為大家分享一篇Go 結(jié)構(gòu)體、數(shù)組、字典和 json 字符串的相互轉(zhuǎn)換方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08Golang并發(fā)發(fā)送HTTP請(qǐng)求的各種方法
在 Golang 領(lǐng)域,并發(fā)發(fā)送 HTTP 請(qǐng)求是優(yōu)化 Web 應(yīng)用程序的一項(xiàng)重要技能,本文探討了實(shí)現(xiàn)此目的的各種方法,從基本的 goroutine 到涉及通道和sync.WaitGroup 的高級(jí)技術(shù),需要的朋友可以參考下2024-02-02GoFrame框架gredis優(yōu)雅的取值和類型轉(zhuǎn)換
這篇文章主要為大家介紹了GoFrame框架gredis優(yōu)雅的取值和類型轉(zhuǎn)換,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06簡(jiǎn)單談?wù)凣olang中的字符串與字節(jié)數(shù)組
這篇文章主要給大家介紹了關(guān)于Golang中字符串與字節(jié)數(shù)組的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Golang具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03golang中import cycle not allowed解決的一種思路
這篇文章主要給大家介紹了關(guān)于golang中import cycle not allowed解決的一種思路,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08