Go 学习笔记(2)— 安装目录、工作区、源码文件和标准命令
GOROOT: Go 語言安裝根目錄的路徑,也就是 GO 語言的安裝路徑。
GOPATH: 若干工作區(qū)目錄的路徑。是我們自己定義的工作空間。在 Go Module 模式之前非常重要,現(xiàn)在基本上用來存放使用 go get 命令獲取的項目。
GOBIN: Go 編譯生成的程序的安裝目錄,比如通過 go install 命令,會把生成的 Go 程序放到該目錄下,即可在終端使用。
1. GOROOT 安裝目錄說明
GOROOT 的值是 Go 安裝目錄。安裝目錄如下所示:
wohu@wohu:/usr/local/go$ ls
api bin CONTRIBUTORS favicon.ico LICENSE PATENTS README.md src VERSION
AUTHORS CONTRIBUTING.md doc lib misc pkg robots.txt test
wohu@wohu:/usr/local/go$
| 目錄 | 說明 |
|---|---|
| api | 用于存放依照 Go 版本順序的 API 增量列表文件。這里所說的 API 包含公開的變量,常量,函數(shù)等 |
| bin | 用于存放主要的標準命令文件,包括 go,godoc 和gofmt |
| doc | 用于存放標準庫的 HTML 格式的程序文檔。我們可以通過 godoc 命令啟動一個 Web 程序展現(xiàn)這些文檔 |
| lib | 用于存放一些特殊的庫文件 |
| misc | 用于存放一些輔助類的說明和工具 |
| pkg | 用于存放安裝 Go 標準庫的所有歸檔文件 |
| src | 用于存放 Go 本身,Go 標準工具以及標準庫的所有源碼文件 |
| test | 存放用來測試和驗證Go本身的所有相關文件 |
- pkg 目錄:
wohu@wohu:/usr/local/go$ ls pkg/
include linux_amd64 linux_amd64_race tool
你會發(fā)現(xiàn)其中有名稱為 linux_amd64 的文件夾,我們稱為平臺相關目錄。這類文件夾的名稱由對應的操作系統(tǒng)和計算架構的名稱組合而成。
通過 go install 命令,Go 程序(這里是標準庫中的程序)會被編譯成平臺相關的歸檔文件存放到其中。另外,pkg/tool/linux_amd64 文件夾存放了使用 Go 制作軟件時用到的很多強大的命令和工具。
wohu@wohu:/usr/local/go$ ls pkg/linux_amd64
archive context.a encoding fmt.a html.a io math.a os reflect.a sort.a syscall.a unicode
bufio.a crypto encoding.a go image io.a mime os.a regexp strconv.a testing unicode.a
bytes.a crypto.a errors.a hash image.a log mime.a path regexp.a strings.a testing.a
compress database expvar.a hash.a index log.a net path.a runtime sync text
container debug flag.a html internal math net.a plugin.a runtime.a sync.a time.a
wohu@wohu:/usr/local/go$
2. GOPATH 工作區(qū)間說明
GOPATH 為自己項目的工作區(qū)間, 筆記學習(1)中我們已經(jīng)進行了設置。通過 go env 可以看到 Go 的全部環(huán)境變量。
wohu@wohu:~/gocode$ go env
GOARCH="amd64"
GOBIN="/home/wohu/gocode/bin"
GOCACHE="/home/wohu/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/wohu/gocode"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build076028171=/tmp/go-build -gno-record-gcc-switches"
GOPATH 是作為編譯后二進制的存放目的地和 import 包時的搜索路徑 (其實也是你的工作目錄,可以在 src 下創(chuàng)建你自己的 Go 源文件, 然后開始工作),一般情況下,Go 源碼文件必須放在工作區(qū)中。
GOPATH 之下主要包含三個目錄: bin、pkg、src
wohu@wohu:~/gocode$ echo $GOPATH
/home/wohu/gocode
wohu@wohu:~/gocode$ ls
bin pkg src
wohu@wohu:~/gocode$
我們需要將工作區(qū)的目錄路徑添加到環(huán)境變量 GOPATH 中。否則,即使處于同一工作區(qū)(事實上,未被加入 GOPATH 中的目錄不用管成為工作區(qū)),代碼之間也無法通過絕對代碼包路徑調用。
在實際開發(fā)環(huán)境中,工作區(qū)可以只有一個,也可以由多個,這些工作區(qū)的目錄路徑都需要添加到 GOPATH 中。與 GOROOT 一樣,我們應確保 GOPATH 一直有效。
GOPATH="/home/wohu/gocode"
在很多與 Go 語言相關的書籍、文章中描述的 GOPATH 都是通過修改系統(tǒng)全局的環(huán)境變量來實現(xiàn)的。然而,這種設置全局 GOPATH 的方法可能會導致當前項目錯誤引用了其他目錄的 Go 源碼文件從而造成編譯輸出錯誤的版本或編譯報出一些無法理解的錯誤提示。
比如說,將某項目代碼保存在 /home/davy/projectA 目錄下,將該目錄設置為 GOPATH 。隨著開發(fā)進行,需要再次獲取一份工程項目的源碼,此時源碼保存在 /home/davy/projectB 目錄下,如果此時需要編譯 projectB 目錄的項目,但開發(fā)者忘記設置 GOPATH 而直接使用命令行編譯,則當前的 GOPATH 指向的是 /home/davy/projectA 目錄,而不是開發(fā)者編譯時期望的 projectB 目錄。編譯完成后,開發(fā)者就會將錯誤的工程版本發(fā)布到外網(wǎng)。
因此,建議大家無論是使用命令行或者使用集成開發(fā)環(huán)境編譯 Go 源碼時, 不要設置全局的 GOPATH ,而是隨項目設置 GOPATH 。
GOPATH 意義:
你可以把 GOPATH 簡單理解成 Go 語言的工作目錄,它的值是一個目錄的路徑,也可以是多個目錄路徑,每個目錄都代表 Go 語言的一個工作區(qū)(workspace)。
我們需要利于這些工作區(qū),去放置 Go 語言的源碼文件(source file),以及安裝(install)后的歸檔文件(archive file,也就是以 .a 為擴展名的文件)和可執(zhí)行文件(executable file)。
歸檔文件在 Linux 下就是擴展名是 .a 的文件,也就是 archive 文件。寫過 C 程序的朋友都知道,這是程序編譯后生成的靜態(tài)庫文件。
Go 語言在多個工作區(qū)中查找依賴包的時候是以怎樣的順序進行的?
答案:先 GOROOT 然后再 GOPATH 。
wohu@ubuntu-dev:~/project/go/src/github.com$ go install github.com/ramya-rao-a/go-outline
can't load package: package github.com/ramya-rao-a/go-outline: cannot find package "github.com/ramya-rao-a/go-outline" in any of:/usr/local/go/src/github.com/ramya-rao-a/go-outline (from $GOROOT)/home/wohu/project/go/src/github.com/ramya-rao-a/go-outline (from $GOPATH)
如果在多個工作區(qū)中都存在導入路徑相同的代碼包會產(chǎn)生沖突嗎?
答案是:不會沖突。因為 Go 語言在尋找代碼包時是有順序的。對于 GOPATH 中的工作區(qū)來說,它會按照你設置的順序進行查找。所以它會找到并使用較靠前的那個工作區(qū)中的同路徑項目。
2.1 src 目錄
src目錄:主要存放Go的源碼文件
用于以代碼包的形式組織并保存 Go 源碼文件,這里的代碼包與 src 下子目錄一一對應。例如,若一個源碼文件被聲明屬于代碼包 log,那么它就應當保存在 “src/log” 目錄中。當然,你也可以把 Go 源碼文件直接放在 src 目錄下,但這樣的 Go 源碼文件就只能被聲明屬于 main代碼包了。
除非用于臨時測試或演示,一般還是建議把 Go 源碼文件存入特定的代碼包中。
2.2 pkg 目錄
pkg目錄:存放編譯好的庫文件, 主要是.a文件
用于存放通過 go install 命令安裝后的代碼包的歸檔文件。前提是代碼包中必需包含 Go 庫源碼文件。歸檔文件是指那些名稱以 .a 結尾的文件。
該目錄與 GOROOT 目錄下的 pkg 目錄功能類似。區(qū)別在于,工作區(qū)中的 pkg 目錄專門用來存放用戶代碼的歸檔文件。
編譯和安裝用戶代碼的過程一般會以代碼包為單位進行。比如 log 包被編譯安裝后,將生成一個名為 log.a 的歸檔文件,并存放在當前工作區(qū)的 pkg 目錄下的平臺相關目錄中。
.a 文件屬于靜態(tài)鏈接庫文件,是某一個代碼包中的程序。Go 語言的鏈接器可以把相關的靜態(tài)庫鏈接在一起,從而生成最終的可執(zhí)行文件。 在 Go 語言對可執(zhí)行程序進行安裝的時候,會把相關的靜態(tài)鏈接庫與之打包在一起。所以生成的可執(zhí)行文件才可以獨立運行的,這也是很明顯的優(yōu)勢。
2.3 bin 目錄
bin目錄:主要存放可執(zhí)行文件
與 pkg 目錄類似,在通過 go install 命令完成安裝后,保存由 Go 命令源碼文件生成的可執(zhí)行文件。在類 Unix 操作系統(tǒng)下,這個可執(zhí)行文件一般來說名稱與源碼文件的主文件名相同。
而在 windows 操作系統(tǒng)下,這個可執(zhí)行文件的名稱則是源碼文件主文件名加 “.exe” 后綴。
需要把 GOPATH 中的可執(zhí)行目錄 bin 也配置到環(huán)境變量中,否則自行下載的第三方 go 工具就無法使用了。
GOBIN="/home/wohu/gocode/bin"
注意:GOPATH 中不要包含 Go 語言的安裝目錄,以便將 Go 語言本身的工作區(qū)同用戶工作區(qū)嚴格分開。通過 Go 工具中的代碼獲取命令 go get ,可以指定項目的代碼下載到我們在 GOPATH 中設定的第一個工作區(qū)中,并在其中完成編譯和安裝。
三個目錄下的文件如下所示:
wohu@wohu:~/gocode$ ls bin/
dlv gocode godef golint go-outline gopkgs goplay gorename goreturns go-symbols guru impl
wohu@wohu:~/gocode$ ls pkg/
linux_amd64 mod
wohu@wohu:~/gocode$ ls src/
github.com golang.org hello hello.go
- Go 語言源碼的組織方式
一個代碼包中可以包含任意個以 .go 為擴展名的源碼文件,這些源碼文件都需要被聲明屬于同一個代碼包。
Go 語言源碼的組織方式就是以環(huán)境變量 GOPATH、工作區(qū)、src 目錄和代碼包為主線的。一般情況下,Go 語言的源碼文件都需要被存放在環(huán)境變量 GOPATH 包含的某個工作區(qū)(目錄)中的 src 目錄下的某個代碼包(目錄)中。
- 了解源碼安裝后的結果
源碼文件通常會被放在某個工作區(qū)的 src 子目錄下。那么在安裝后如果產(chǎn)生了歸檔文件(以 .a 為擴展名的文件),就會放進該工作區(qū)的 pkg 子目錄;如果產(chǎn)生了可執(zhí)行文件,就可能會放進該工作區(qū)的 bin 子目錄。
- 理解構建和安裝 Go 程序的過程
構建使用命令 go build,安裝使用命令 go install 。構建和安裝代碼包的時候都會執(zhí)行編譯、打包等操作,并且,這些操作生成的任何文件都會先被保存到某個臨時的目錄中。
如果構建的是庫源碼文件,那么操作后產(chǎn)生的結果文件只會存在于臨時目錄中。這里的構建的主要意義在于檢查和驗證。
如果構建的是命令源碼文件,那么操作的結果文件會被搬運到源碼文件所在的目錄中。
安裝操作會先執(zhí)行構建,然后還會進行鏈接操作,并且把結果文件搬運到指定目錄。進一步說,
- 如果安裝的是庫源碼文件,那么結果文件會被搬運到它所在工作區(qū)的
pkg目錄下的某個子目錄中。 - 如果安裝的是命令源碼文件,那么結果文件會被搬運到它所在工作區(qū)的
bin目錄中,或者環(huán)境變量GOBIN指向的目錄中。
3. 源碼文件
Go 源碼文件有分 3 種,即命令源碼文件,庫源碼文件和測試源碼文件。不管是命令源文件還是庫源文件,在同一個目錄下的所有源文件,其所屬包的名稱必須一致的。
構建 = 編譯 + 鏈接
- 編譯和鏈接是兩個步驟。
- 一個代碼包在被安裝(編譯、鏈接并生成相應文件)完成之后,相應的靜態(tài)鏈接庫文件就會被
go工具放到pkg目錄里。 - 在編譯的時候,如果
pkg目錄里已經(jīng)有了依賴代碼包的靜態(tài)鏈接庫文件,那么在默認情況下go工具就不會再編譯一遍了。 - 在鏈接的時候,如果依賴包的靜態(tài)鏈接庫文件已經(jīng)存在于
pkg目錄中了,那么go工具就會直接使用。這個鏈接的過程實際上就是把主包和依賴包鏈接在一起。
之所以 Go 程序這么方便,一部分原因就是它的工具對靜態(tài)鏈接庫的管理。
3.1 命令源碼文件
聲明為屬于 main 代碼包,并且包含無參數(shù)聲明和結果聲明的 main 函數(shù)的源碼文件。這類源碼是程序的入口,可以獨立運行(使用 go run 命令),也可以被 go build 或 go install 命令轉換為可執(zhí)行文件。
同一個代碼包中的所有源碼文件,其所屬代碼包的名稱必須一致。如果命令源碼文件和庫源碼文件處于同一代碼包中,該包就無法正確執(zhí)行 go build 和 go install 命令。換句話說,這些源碼文件也就無法被編譯和安裝。因此,命令源碼文件通常會單獨放在一個代碼包中。一般情況下,一個程序模塊或軟件的啟動入口只有一個。
同一個代碼包中可以有多個命令源碼文件,可通過 go run 命令分別運行它們。但通過 go build 和 go install 命令無法編譯和安裝該代碼包。所以一般情況下,不建議把多個命令源碼文件放在同一個代碼包中。
當代碼包中有且僅有一個命令源碼文件時,在文件所在目錄中執(zhí)行 go build 命令,即可在該目錄下生成一個與目錄同名的可執(zhí)行文件;若使用 go install 命令,則可在當前工作區(qū)的 bin 目錄下生成相應的可執(zhí)行文件。
總結:如果一個 Go 源文件被聲明屬于 main 包,并且該文件中包含 main 函數(shù),則它就是命令源碼文件。命令源文件屬于程序的入口,可以通過 Go 語言的go run命令運行或者通過go build命令生成可執(zhí)行文件。
3.2 庫源碼文件
庫源文件則是指存在于某個包中的普通源文件,并且?guī)煸次募胁话?**main** 函數(shù)。庫源碼文件聲明的包名會與它實際所屬的代碼包(目錄)名一致,且?guī)煸创a文件中不包含無參數(shù)聲明和無結果聲明的 main 函數(shù)。
如在 basic/set 目錄下執(zhí)行 go install 命令,成功地安裝了 basic/set 包,并生成一個名為 set.a 的歸檔文件。歸檔文件的存放目錄由以下規(guī)則產(chǎn)生:
- 安裝庫源碼文件時所生成的歸檔文件會被存放到當前工作區(qū)的 pkg 目錄中。
- 根據(jù)被編譯的目標計算機架構,歸檔文件會被放置在 pkg 目錄下的平臺相關目錄中。如上的 set.a 在 64 位 window 系統(tǒng)上就是 pkg/windows_amd64 目錄中。
- 存放歸檔文件的目錄的相對路徑與被安裝的代碼包的上一級代碼包的相對路徑是一致的。
第一個相對路徑就是相對于工作區(qū)的 pkg 目錄下的平臺相關目錄而言的,而第二個相對路徑是相對于工作區(qū)的 src 目錄而言的。如果被安裝的代碼包沒有上一級代碼包(也就是說它的父目錄就是工作的 src 目錄),那么它的歸檔文件就會被直接存放到當前工作區(qū)的 pkg 目錄的平臺相關目錄下。如 basic 包的歸檔文件 basic.a 總會被直接存放到 pkg/windows_amd64 目錄下,而 basic/set 包的歸檔文件 set.a 則會被存放到 pkg/windows_amd64/basic 目錄下。
3.3 測試源碼文件
這是一種特殊的庫文件,可以通過執(zhí)行 go test 命令運行當前代碼包下的所有測試源碼文件。成為測試源碼文件的充分條件有兩個:
- 文件名需要以 ”_test.go” 結尾
- 文件中需要至少包含該一個名稱為 Test 開頭或 Benchmark 開頭,擁有一個類型為 *testing.T 或 testing.B 的參數(shù)的函數(shù)。類型 testing.T 或 testing.B 是兩個結構體類型。
當在某個代碼包中執(zhí)行 go test 命令,該代碼包中的所有測試源碼文件就會被找到并運行。
注意:存儲 Go 代碼的文本文件需要以 UTF-8 編碼存儲。如果源碼文件中出現(xiàn)了非 UTF-8 編碼的字符,則在運行、編譯或安裝時,Go 會拋出 “illegal UTF-8 sequence” 的錯誤。
代碼示例 :
wohu@wohu:~/GoCode/src$ tree -L 3
.
├── download
│ └── download_demo.go
├── main.go
└── upload└── upload_demo.go
download_demo.go 代碼內容:
package downloadimport "fmt"
// Download_imge 方法名首字母大寫,表示外部可以調用
func Download_imge() {fmt.Println("This is download image demo")
}
upload_demo.go 代碼內容:
package uploadimport "fmt"
// Upload_imge 方法名首字母大寫,表示外部可以調用
func Upload_imge() {fmt.Println("This is upload image demo")
}
main.go 代碼內容:
package mainimport ("download""upload"
)func main() {upload.Upload_imge()download.Download_imge()
}
分別執(zhí)行 go run , go build , go install 命令, 可以看到能有正常的輸出、會生成二進制文件 main,并且在 bin 目錄下有對應的二進制文件。
wohu@wohu:~/GoCode/src$ go run main.go
This is upload image demo
This is download image demo
wohu@wohu:~/GoCode/src$ ls
download main.go upload
wohu@wohu:~/GoCode/src$ go build main.go
wohu@wohu:~/GoCode/src$ ls
download main main.go upload
wohu@wohu:~/GoCode/src$ ./main
This is upload image demo
This is download image demo
wohu@wohu:~/GoCode/src$ go install main.go
wohu@wohu:~/GoCode/src$ ls ../bin/main
wohu@wohu:~/GoCode/src$ ls ../pkg/
wohu@wohu:~/GoCode/src$
4. 標準命令簡述
Go 本身包含來大量用于處理 Go 程序的命令和工具。
4.1 常用命令
- build
用于編譯指定的代碼包或 Go 語言源碼文件。命令源碼文件會被編譯成可執(zhí)行文件,并存放到命令執(zhí)行的目錄或指定目錄下。而庫源碼文件被編譯后,則不會在非臨時目錄中留下任何文件。
- clean
用于清除因執(zhí)行其他 go 命令而遺留下來的臨時目錄和文件。
- doc
用于顯示打印 Go 語言代碼包以及程序實體的文檔。
- env
用于打印 Go 語言相關的環(huán)境信息。
- fix
用于修正指定代碼的源碼文件中包含的過時語法和代碼調用。這使得我們在升級 Go 語言版本時,可以非常方便地同步升級程序。
- fmt
用于格式化指定代碼包中的 Go 源碼文件。實際上,它是通過執(zhí)行
gofmt命令來實現(xiàn)功能的。
- generate
用于識別指定代碼中資源文件中的 “go:generate” 注釋,并執(zhí)行其攜帶的任意命令。該命令獨立于 Go 語言標準的編譯和安裝體系。如果你有需要解析的 “go:generate” 注釋,就單獨運行它。這個命令非常有用,我常用它自動生成或改動 Go 源碼文件。
- get
用于下載,編譯并安裝指定改動代碼包及其依賴包。從我們自己的代碼中轉站或第三方代碼庫上自動拉取代碼,就全靠它了。
- install
用于編譯并安裝指定的代碼包及其依賴包。安裝命令源碼文件后,代碼包所在的工作區(qū)目錄的 bin 子目錄,或者當前環(huán)境變量 GOBIN 指向的目錄中會生成相應的可執(zhí)行文件。安裝源碼文件后,會在代碼包所在的工作目錄的 pkg 子目錄中生成相應的歸檔文件。
- list
用于顯示指定代碼包的信息,它可謂是代碼包分析的一大便利工具。利用 Go 語言標準代碼庫代碼包 “text/template” 中規(guī)定的模版語法,你可以非常靈活的控制輸出信息。
- run
用于編譯并運行指定的代碼源碼文件。當你想不生成可執(zhí)行文件而直接運行命令源碼文件時,就需要用到它。
- test
用于測試指定的代碼包,前提是該代碼包目錄中必須存在測試源代碼文件。
- tool
用于運行 Go 語言的特殊工具。
- vet
如果開發(fā)人員已經(jīng)寫了一些代碼,vet 命令會幫開發(fā)人員檢測代碼的常見錯誤。讓我們看看 vet 捕獲哪些類型的錯誤。
- Printf類函數(shù)調用時,類型匹配錯誤的參數(shù)。
- 定義常用的方法時,方法簽名的錯誤。
- 錯誤的結構標簽。
- 沒有指定字段名的結構字面量。
用于檢查指定代碼包中的 Go 語言代碼,并報告發(fā)現(xiàn)可疑代碼問題。該命令提供了除編譯之外的又一個程序檢查方法,可用于找到程序中的潛在錯誤。
go vet main.go
- version
用于顯示當前安裝的 Go 語言的版本信息以及計算環(huán)境。
4.2 附加參數(shù)
執(zhí)行上述命令時,可以通過附加一些額外的標記來定制命令的執(zhí)行過程。下面是一個比較通用的標記。
- -n
使命令僅打印其執(zhí)行過程中用到的所有命令,而不真正執(zhí)行它們。如果只想查看或驗證命令的執(zhí)行過程,而不想改變任何東西,使用它正合適。
- -race
用于檢測并報告指定 Go 語言程序中存在的數(shù)據(jù)競爭問題。當用 Go 語言編寫并發(fā)程序時,這是很重要的檢測手段之一。
- -v
用于打印命令執(zhí)行過程中涉及的代碼包。這一定包括我們指定的目標代碼包,并且有時還會包括該代碼包直接或間接依賴的那些代碼包。這會讓你知道哪些代碼包被命令處理過了。
- -work
用于打印命令執(zhí)行時生成和使用的臨時工作目錄的名字,且命令執(zhí)行完成后不刪除它。這個目錄下的文件可能會對你有用,也可以從側面了解命令的執(zhí)行過程。如果不添加此標記,那么臨時工作目錄會在命令執(zhí)行完畢前刪除。
- -x:
使命令打印其執(zhí)行過程中用到的所有命令,同時執(zhí)行它們。
我們可以把這些標記看作命令的特殊參數(shù),他們都可以添加到命令名稱和命令的真正參數(shù)中間。用于編譯, 安裝,運行和測試 Go 語言代碼包或源碼文件的命令都支持它們。上面提到了 tool 這個子命令,它用來運行一些特殊的 Go 語言工具。直接執(zhí)行 go tool 命令,可以看到這些特殊工具。它們有的是其他 Go 標準命令的底層支持,有的規(guī)則是可以獨當一面的利器。其中有兩個工具值得特別介紹一下。
- pprof
用于以交互的方式訪問一些性能概要文件。命令將會分析給定的概要文件,并根據(jù)要求提供高可讀性的輸出信息。這個工具可以分析的概要文件包括 CPU 概要文件,內存概要文件和程序阻塞概要文件。這些包含 Go 程序運行信息的概要文件,可以通過標準庫代碼 runtime 和runtime/pprof 中的程序來生成。
- trace
用于讀取 Go 程序蹤跡文件,并以圖形化的方式展現(xiàn)出來。它能夠讓我們深入了解 Go 程序在運行過程中的內部情況。比如,當前進程中堆的大小及使用情況。又比如,程序中的多個 goruntime 是怎樣調度的,以及它們在某個時刻被調度的原因。Go 程序蹤跡文件可以通過標準代碼包 “runtime/trace” 和 “net/http/pprof” 中的程序來生成。
上述的兩個特殊的工具對 Go 程序調優(yōu)非常有用。如果想探究程序運行的過程,或者想讓程序跑的更快,更穩(wěn)定,那么這兩個工具是必知必會的。另外,這兩個工具都受到 go test 命令的直接支持。因此你可以很方便地把它們融入到程序測試當中。
總結
以上是生活随笔為你收集整理的Go 学习笔记(2)— 安装目录、工作区、源码文件和标准命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS Code go 插件安装失败 r.
- 下一篇: 乌镇不买门票可以玩哪些地方