溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

gopl 包和工具

發(fā)布時(shí)間:2020-07-26 20:12:32 來(lái)源:網(wǎng)絡(luò) 閱讀:430 作者:騎士救兵 欄目:編程語(yǔ)言

空導(dǎo)入

如果導(dǎo)入包的名字沒(méi)有在文件中引用,就會(huì)產(chǎn)生一個(gè)編譯錯(cuò)誤。但是,有時(shí)候必須導(dǎo)入一個(gè)包,這僅僅是為了利用它的副作用:對(duì)包級(jí)別的變量執(zhí)行初始化表達(dá)式求值,并執(zhí)行它的 init 函數(shù)。這里必須使用一個(gè)重命名導(dǎo)入,使用下劃線作為替代的名字。這表示導(dǎo)入的內(nèi)容為空白標(biāo)識(shí)符,通常情況下,空白標(biāo)識(shí)不可能被引用:

import _ "image/png" // 注冊(cè) PNG 解碼器

空白導(dǎo)入,多數(shù)情況下,使用空白引用導(dǎo)入額外的包,開(kāi)啟主程序中可選的特性。

命名

一些建議,關(guān)于遵從 Go 的習(xí)慣來(lái)給包和它的成員進(jìn)行命名。

包的命名

包名使用簡(jiǎn)短的名字,但是不要短到完全看不懂。
盡可能保持可讀性和無(wú)歧義。例如,不要把一個(gè)輔助工具包命名為 util,使用 imageutil 或 ioutil 這樣更具體和清晰的名字。
避免使用經(jīng)常用于相關(guān)局部變量的名字作為包名,或者迫使使用者使用重命名導(dǎo)入。例如,path 就要避免用作包名。
命名通常使用統(tǒng)一的形式,使用復(fù)數(shù)形式來(lái)避免和關(guān)鍵字的沖突。例如,標(biāo)準(zhǔn)包 bytes、errors、strings。

包成員的命名

引用包的成員會(huì)帶上包名,所以設(shè)計(jì)成員名稱(chēng)的時(shí)候,要考慮包名和成員名這兩部分協(xié)同一起表示的意義,而不只是成員名。
對(duì)于包導(dǎo)出的一個(gè)數(shù)據(jù)類(lèi)型及其方法,通常有一個(gè) New 函數(shù)用來(lái)創(chuàng)建實(shí)例。而導(dǎo)出的類(lèi)型的名稱(chēng)可能和包名重復(fù)。例如,template.Template 或 rand.Rand。
包中最重要的成員使用最簡(jiǎn)單的命名。

go 工具

go 工具將不同種類(lèi)的工具集合并為一個(gè)命名集。它的命令行接口使用“瑞士軍刀”風(fēng)格,有十幾個(gè)子命令??梢赃\(yùn)行go help來(lái)查看內(nèi)置文檔的索引:

        bug         start a bug report
        build       compile packages and dependencies
        clean       remove object files and cached files
        doc         show documentation for package or symbol
        env         print Go environment information
        fix         update packages to use new APIs
        fmt         gofmt (reformat) package sources
        generate    generate Go files by processing source
        get         download and install packages and dependencies
        install     compile and install packages and dependencies
        list        list packages or modules
        mod         module maintenance
        run         compile and run Go program
        test        test packages
        tool        run specified go tool
        version     print Go version
        vet         report likely mistakes in packages

工作空間的組織

環(huán)境變量 GOPATH 執(zhí)行工作空間的根。當(dāng)需要切換不同的工作空間時(shí),更新 GOPATH 變量即可。
切換環(huán)境變量然后下載代碼:

$ export GOPATH=$HOME/gobook
$ go get gopl.io/...

命令最后的三個(gè)點(diǎn)的意義,go get 命令下一節(jié)會(huì)講。

GOPATH 有三個(gè)子目錄,分別用于存放不同類(lèi)型的文件:

  • src:源碼文件。每一個(gè)包在一個(gè)目錄中
  • pkg:歸檔文件。構(gòu)建工具存儲(chǔ)編譯后的包的位置,參考后面的 go install 命令
  • bin:可執(zhí)行文件。許多用戶會(huì)將該目錄添加到可執(zhí)行程序的搜索列表中

環(huán)境變量 GOROOT 指定 Go 發(fā)行版的根目錄,其中提供所有標(biāo)準(zhǔn)庫(kù)的包。用戶無(wú)須設(shè)置 GOROOT,因?yàn)槟J(rèn)情況下在安裝 Go 言語(yǔ)的時(shí)候會(huì)將其設(shè)置為安裝路徑。(如果機(jī)器上裝了多個(gè)版本的Go,就可以通過(guò)這個(gè)環(huán)境變量來(lái)切換了吧。不過(guò)Go目前需要使用多個(gè)版本的問(wèn)題。

命令 go env 可以查看環(huán)境變量。

包的下載

go get 命令可以下載單一的包,也可以使用 ... 符號(hào)來(lái)下載子目錄或倉(cāng)庫(kù)。并且還會(huì)計(jì)算并下載所有依賴(lài)的包。

讓包使用一個(gè)自定義的導(dǎo)入路徑,但是真實(shí)的代碼卻是由更通用的站點(diǎn)提供,例如 github。這只需要在頁(yè)面的 HTML 中添加如下的元數(shù)據(jù),它重定向 go 工具到實(shí)際托管地址的 Git 倉(cāng)庫(kù):

<meta name="go-import" content="golang.org/x/net git https://go.googlesource.com/net">

go get 指定 -u 參數(shù),將確保命令會(huì)訪問(wèn)所有的包(無(wú)論本地是否已經(jīng)有了)更新到最新版本。如果沒(méi)有這個(gè)參數(shù),已經(jīng)存在在本地的包就做任何處理和確認(rèn)。

包的構(gòu)建

命令 go build 編譯每一個(gè)命令行參數(shù)中的包。如果包是一個(gè)庫(kù),結(jié)果會(huì)被丟棄。如果是main包,則會(huì)創(chuàng)建可執(zhí)行程序。
命令 go run 則可以構(gòu)建之后直接運(yùn)行。適用于即用即拋型的程序。
第一個(gè)不是以 .go 結(jié)尾的參數(shù)會(huì)作為 Go 可執(zhí)行程序的參數(shù)列表的開(kāi)始。

默認(rèn)情況下,go build 命令構(gòu)建所有需要的包以及它們所有的依賴(lài),然后丟棄除了最終可執(zhí)行程序之外的所有編譯后的代碼。
命令 go install 和 go build 非常相似,區(qū)別是它會(huì)保存每一個(gè)包的編譯代碼和命令,而不丟棄。編譯后的包保存在 $GOPATH/pkg 目錄中。這樣,之后的 go build 和 go install 對(duì)于沒(méi)有改變的包和命令不需要再重新編譯,從而使后續(xù)的構(gòu)建更快完成。
go build 使用 -i 參數(shù),也會(huì)安裝那些編譯目標(biāo)依賴(lài)的且還未被安裝的代碼包。同樣是安裝到 pkg 目錄。

包的文檔化

每一個(gè)導(dǎo)出的包成員的聲明以及包聲明自身應(yīng)該使用文檔注釋來(lái)描述它的目的和用途。Go 文檔注釋總是完整的語(yǔ)句,第一行通常是摘要說(shuō)明,以被注釋者的名稱(chēng)(比如函數(shù)名)開(kāi)頭。
包聲明的前面的文檔注釋是對(duì)整個(gè)包進(jìn)行描述。它可以出現(xiàn)在任何一個(gè)文件里,但是每一個(gè)包里值能在一個(gè)文件開(kāi)頭寫(xiě)包的文檔注釋。比較長(zhǎng)的包注釋可以使用一個(gè)單獨(dú)的注釋文件,文件名通常叫 doc.go。

go doc
go doc 工具輸出在命令行上指定的內(nèi)容的聲明和整個(gè)文檔注釋?zhuān)梢允且粋€(gè)包、一個(gè)包成員、一個(gè)方法。

godoc
這是另一個(gè)工具,它提供一個(gè) HTML 頁(yè)面,展示的內(nèi)容不少于 go doc 命令。
如果想瀏覽自己的包,可以在自己的工作區(qū)目錄中運(yùn)行 godoc。在執(zhí)行下面的命令后,在瀏覽器中訪問(wèn) http://localhost:8000/pkg

$ godoc -http :8000

還可以使用 -analysis=type 和 -analysis=pointer 命令行標(biāo)志參數(shù),用于打開(kāi)文檔和代碼中關(guān)于靜態(tài)分析的結(jié)果。

內(nèi)部包

導(dǎo)入路徑中包含 internal 的情況,會(huì)被特殊對(duì)待。這種包叫內(nèi)部包,內(nèi)部包只能被特定范圍內(nèi)的包導(dǎo)入,就是以這個(gè)內(nèi)部包的父目錄為根的目錄樹(shù)中的其他的包。

包的查詢

go list 工具上報(bào)可用包的信息。通過(guò)簡(jiǎn)單的形式,go list 判斷一個(gè)包是否存在于工作區(qū)目錄中,如果存在就輸出它的導(dǎo)入路徑:

PS H:\Go\src\gopl\ch20> go list gopl/ch9/bank1
gopl/ch9/bank1

go list 命令的參數(shù)可以包含 “...” 通配符(類(lèi)似于通配符星號(hào)的作用),用來(lái)匹配包的導(dǎo)入路徑中的任意字符串。這可以枚舉當(dāng)前工作區(qū)目錄下的所有的包: go list ... ,輸出的結(jié)果實(shí)在太多了。
下面是一個(gè)指定的目錄中的所有的包:

PS H:\Go\src\gopl\ch20> go list gopl/ch9/...
gopl/ch9/bank1
gopl/ch9/bank2
gopl/ch9/bank3
gopl/ch9/hacker

下面則是查找某個(gè)主題:

PS H:\Go\src\gopl\ch20> go list ...netcat...
gopl/ch8/netcat1
gopl/ch8/netcat2
gopl/ch8/netcat3
gopl/exercise8/e8/netcat

這里匹配的并不是包名,而是包的整個(gè)導(dǎo)入路徑。這也包括從工作區(qū)目錄為根開(kāi)始的路徑所組成的字符串里的任何內(nèi)容。

go list 命令獲取每一個(gè)包的完整元數(shù)據(jù),而不僅僅是導(dǎo)入路徑,并且提供各種對(duì)于用戶或者其他工具可訪問(wèn)的格式。

-json 標(biāo)記使 go list 以 JSON 格式輸出每一個(gè)包的完整記錄:

PS H:\Go\src\gopl\ch20> go list -json gopl/ch9/bank1
{
        "Dir": "H:\\Go\\src\\gopl\\ch9\\bank1",
        "ImportPath": "gopl/ch9/bank1",
        "Name": "bank",
        "Doc": "這是一個(gè)只有一個(gè)賬戶的并發(fā)安全銀行",
        "Target": "H:\\Go\\pkg\\windows_amd64\\gopl\\ch9\\bank1.a",
        "Root": "H:\\Go\\",
        "Match": [
                "gopl/ch9/bank1"
        ],
        "Stale": true,
        "StaleReason": "build ID mismatch",
        "GoFiles": [
                "main.go"
        ]
}

這里展開(kāi)介紹其中三個(gè)字段的意義:

  1. GoFiles :庫(kù)源碼文件或命令源碼文件,就是實(shí)際保存產(chǎn)品代碼的文件列表
  2. TestGoFiles :測(cè)試源碼文件,都是以以 _test.go 結(jié)尾的文件,僅在編譯測(cè)試的時(shí)候才會(huì)使用
  3. XTestGoFiles :外部測(cè)試包。也是測(cè)試源碼文件,也是 _test.go 結(jié)尾,也是在測(cè)試過(guò)程中使用的。下篇的測(cè)試章節(jié)會(huì)講到

-f 標(biāo)記可以讓用戶通過(guò) text/temple 包提供的模板語(yǔ)言來(lái)定制輸出的格式:

PS H:\Go\src\gopl\ch20> go list -json strconv
{
...
        "Deps": [
                "errors",
                "internal/cpu",
                "math",
                "math/bits",
                "unicode/utf8",
                "unsafe"
        ],
...
}

PS H:\Go\src\gopl\ch20> go list -f "{{join .Deps \"" \""}}" strconv
errors internal/cpu math math/bits unicode/utf8 unsafe
PS H:\Go\src\gopl\ch20> go list -f '{{join .Deps \" \"}}' strconv
errors internal/cpu math math/bits unicode/utf8 unsafe
PS H:\Go\src\gopl\ch20> go list -f "{{join .Deps `` ``}}" strconv
errors internal/cpu math math/bits unicode/utf8 unsafe
PS H:\Go\src\gopl\ch20> go list -f '{{join .Deps ` `}}' strconv
errors internal/cpu math math/bits unicode/utf8 unsafe

由于這里 -f 的參數(shù)中有空格,必須要用引號(hào)包起來(lái)。而參數(shù)的內(nèi)容中還包含引號(hào),所以這個(gè)參數(shù)很難寫(xiě)。這里只給出幾個(gè)示例,具體什么規(guī)則講不清楚,大概有下面幾點(diǎn):

  • 首先,這個(gè)windows的環(huán)境。Linux下沒(méi)有這么坑
  • 雙引號(hào)內(nèi)部的特殊符號(hào),需要重復(fù)寫(xiě)兩遍,兩個(gè)雙引號(hào)表示一個(gè)雙引號(hào)
  • 單引號(hào)內(nèi)部的特殊符號(hào),不用重復(fù)寫(xiě)兩遍
  • 雙引號(hào)前面要轉(zhuǎn)義,所以在前面要加上斜杠(\)
  • 最后兩個(gè)命令,內(nèi)層用的是撇號(hào)(`),所以不要加斜杠轉(zhuǎn)義

下面的命令輸出標(biāo)準(zhǔn)庫(kù)的 compress 子樹(shù)中每個(gè)包的直接導(dǎo)入記錄:

PS H:\Go\src\gopl\ch20> go list compress/...
compress/bzip2
compress/flate
compress/gzip
compress/lzw
compress/zlib

PS H:\Go\src\gopl\ch20> go list -f "{{.ImportPath}} -> {{join .Imports \"" \""}}" compress/...
compress/bzip2 -> bufio io sort
compress/flate -> bufio fmt io math math/bits sort strconv sync
compress/gzip -> bufio compress/flate encoding/binary errors fmt hash/crc32 io time
compress/lzw -> bufio errors fmt io
compress/zlib -> bufio compress/flate errors fmt hash hash/adler32 io

go list 命令對(duì)于一次性的交互查詢和構(gòu)建、測(cè)試腳本都非常有用。更多的參數(shù)信息,可以通過(guò) go help list 來(lái)獲取。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI