[Go語言學習筆記] 01 工作區和GOPATH
Go語言3個環境變數:
- GOROOT:GO語言按照根路徑,也就是GO語言的安裝路徑。
- GOPATH:若干工作區目錄的路徑。是我自己定義的工作空間。
- GOBIN:GO程式生成的可執行檔案(executable file)的路徑。
工作區和GOPATH:
程式碼包匯入路徑:
Import “github.com/labstack/echo”
在工作區中,一個程式碼包的匯入路徑實際上就是從src子目錄,到該包的實際儲存位置的相對路徑。
某個工作區的src子目錄下的原始碼檔案在安裝後會被放置到當前工作區的pkg子目錄下對應的目錄中,或者被直接放置到該工作區的bin子目錄中。
面試題:設定GOPATH有什麼意義?
答:GOPATH是Go語言的工作目錄,是一個目錄的路徑,每一個路徑程式碼一個Go語言工作區。
利用這些工作區放置Go 語言的原始碼檔案,安裝後的歸檔檔案和可執行檔案。
GO語言在生命週期的所有操作(編碼,依賴管理,構建,測試,安裝等)基本都圍繞GOPATH和工作區進行的。
意義在於程式碼結構的分層。
• 原始碼檔案放在工作區的src目錄
• 歸檔檔案放在工作區的pkg目錄
• 可執行檔案放在工作區的bin目錄
• 歸檔檔案的相對目錄與 pkg 目錄之間還有一級目錄,叫做平臺相關目錄。
構建和安裝 Go 程式的過程:
構建命令:go build
構建->庫原始碼檔案->臨時目錄
意義在於檢查和驗證
構建->命令原始碼檔案->原始碼檔案所在目錄
安裝命令:go install
安裝->構建->連結->搬運到指定目錄
(如果安裝是庫原始碼原始檔,那麼就在pkg目錄的某個子目錄中)
(如果安裝是命令原始碼檔案,那麼就在bin目錄的某個子目錄中,或GOBIN)
思考題:
1. GO語言在多個工作區中查詢依賴包的時候是以怎樣的順序進行的?
三個緯度延伸總結回答:
總執行順序的角度
引入的包 -> 當前包的變數常量 -> init()[多個同一包則按照順序執行] -> main函式
依賴包執行順序
被依賴的總是優先執行初始化,一個包只會被初始化一次。 a引入b,b引入c,則執行順序c -> b -> a
單個包執行順序的角度
總的前提:按照包中原始檔名的字典順序來排序執行。
當前包排序後的變數常量 -> 排序後的init()
2. 如果在多個工作區中都存在匯入路徑相同的程式碼包會產生衝突嗎?
不衝突,因為按順序找到所需要的包就不往後找了
本系列筆記摘錄自極客時間的《Go語言核心36講》,版權歸極客時間所有。