第一章重點(diǎn):
該系列主要對郝林老師的課程做個人總結(jié)O熬睢!蝙昙!文章在個人git下面闪萄,README里面寫了郝林老師的課程地址和訂閱方式
https://github.com/wenxuwan/go36
1.GO 語言安裝的時候主要有三個環(huán)境變量:
GOROOT、GOPATH 和 GOBIN
通過 go env 可以查看go語言的一系列的環(huán)境變量的配置.
go env
GOROOT:代表go的安裝路徑奇颠,一般你安裝完go語言之后就有了败去。
GOPATH:一個目錄路徑,也可以包含多個目錄路徑烈拒,每個目錄都代表了go語言的一個“工作區(qū)”圆裕。目錄下面有三個目錄广鳍,src,bin,pkg。
src : 用來存放源代碼文件吓妆。
bin: 目錄里面存放的都是通過 go install 命令安裝后赊时,由 Go 命令源碼文件生成的可執(zhí)行文件。
有兩種情況下行拢,bin 目錄會變得沒有意義祖秒。
當(dāng)設(shè)置了有效的 GOBIN 環(huán)境變量以后,bin 目錄就變得沒有意義舟奠。
如果 GOPATH 里面包含多個工作區(qū)路徑的時候竭缝,必須設(shè)置 GOBIN 環(huán)境變量,否則就無法安裝 Go 程序的可執(zhí)行文件沼瘫。
pkg:用來存放通過 go install 命令安裝后的代碼包的歸檔文件(.a 文件)
GOBIN:存放可執(zhí)行文件的文件目錄抬纸。
Go 的源碼文件分類:
(1)命令源碼文件:
聲明自己屬于 main 代碼包、包含無參數(shù)聲明和結(jié)果聲明的 main 函數(shù)晕鹊。
命令源碼文件被安裝以后松却,GOPATH 如果只有一個工作區(qū),那么相應(yīng)的
可執(zhí)行文件會被存放當(dāng)前工作區(qū)的 bin 文件夾下溅话;如果有多個工作區(qū),
就會安裝到 GOBIN 指向的目錄下歌焦。
(2)庫源碼文件
庫源碼文件就是不具備命令源碼文件上述兩個特征的源碼文件飞几。存在于某個代碼包中的普通的源碼文件。
(3)測試源碼文件
名稱以 _test.go 為后綴的代碼文件独撇,并且必須包含 Test 或者 Benchmark 名稱前綴的函數(shù)屑墨。
詳情可以參照https://studygolang.com/articles/10572
2. Go 語言源碼的組織方式
代碼包的名字和代碼包下面的代碼的package name 一般是同名的,如果不同纷铣,在構(gòu)建的過程中就以代碼包為準(zhǔn)卵史。
GO語言也是以代碼包為基本的組織單位。比如:
import proto "github.com/golang/protobuf/proto"
在工作區(qū)內(nèi)以躯,一個代碼包的引入,其實就是以GOPATH/src為基準(zhǔn)的相對路徑啄踊。
3.go build 的使用
go build 默認(rèn)不會重新編譯目標(biāo)代碼所依賴的代碼包忧设。當(dāng)然如果依賴的的.a文件不存在或者源代碼變化還是會被編譯。
go build -a //強(qiáng)制編譯依賴的庫
go build -x //顯示執(zhí)行了哪些操作
go build -v //可以看到編譯的所有代碼包的名字和 -a 搭配很好
總結(jié)
GOPATH 個人認(rèn)為主要是給GO語言的管理提供了一個相對的“絕對路徑”颠通。這樣保證代碼的管理是有一個標(biāo)準(zhǔn)目錄作為“根目錄的”址晕。
問題
-
Go 語言在多個工作區(qū)中查找依賴包的時候是以怎樣的順序進(jìn)行的?
如果有多個工作區(qū)顿锰,那么是按照GOPATH里面的先后順序查找的
-
如果在多個工作區(qū)中都存在導(dǎo)入路徑相同的代碼包會產(chǎn)生沖突嗎谨垃?
不會沖突启搂,像上面說的會按照順序查找執(zhí)行
拓展
如果我的src下面的文件夾名字叫做hello,但package的名字叫做HelloGO
package HelloGo
import "fmt"
func PrintHello(){
fmt.Println("Hello Go")
}
這時候如果你想調(diào)用這個包刘陶,代碼應(yīng)該怎么寫胳赌,
import HelloGo?
還是import hello
答案肯定是import hello的易核,因為GOPATH的特性匈织,只會按照目錄來查找包,但你調(diào)用的時候就不能用目錄名字來調(diào)用了:
package main
import "fmt"
import "hello"
func main() {
fmt.Println("Hello, world!")
HelloGo.PrintHello() //導(dǎo)入包的時候用文件夾名字牡直,調(diào)用函數(shù)用package的名字
}