91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

gopl 包和工具

發布時間:2020-07-26 20:12:32 來源:網絡 閱讀:430 作者:騎士救兵 欄目:編程語言

空導入

如果導入包的名字沒有在文件中引用,就會產生一個編譯錯誤。但是,有時候必須導入一個包,這僅僅是為了利用它的副作用:對包級別的變量執行初始化表達式求值,并執行它的 init 函數。這里必須使用一個重命名導入,使用下劃線作為替代的名字。這表示導入的內容為空白標識符,通常情況下,空白標識不可能被引用:

import _ "image/png" // 注冊 PNG 解碼器

空白導入,多數情況下,使用空白引用導入額外的包,開啟主程序中可選的特性。

命名

一些建議,關于遵從 Go 的習慣來給包和它的成員進行命名。

包的命名

包名使用簡短的名字,但是不要短到完全看不懂。
盡可能保持可讀性和無歧義。例如,不要把一個輔助工具包命名為 util,使用 imageutil 或 ioutil 這樣更具體和清晰的名字。
避免使用經常用于相關局部變量的名字作為包名,或者迫使使用者使用重命名導入。例如,path 就要避免用作包名。
命名通常使用統一的形式,使用復數形式來避免和關鍵字的沖突。例如,標準包 bytes、errors、strings。

包成員的命名

引用包的成員會帶上包名,所以設計成員名稱的時候,要考慮包名和成員名這兩部分協同一起表示的意義,而不只是成員名。
對于包導出的一個數據類型及其方法,通常有一個 New 函數用來創建實例。而導出的類型的名稱可能和包名重復。例如,template.Template 或 rand.Rand。
包中最重要的成員使用最簡單的命名。

go 工具

go 工具將不同種類的工具集合并為一個命名集。它的命令行接口使用“瑞士軍刀”風格,有十幾個子命令。可以運行go help來查看內置文檔的索引:

        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

工作空間的組織

環境變量 GOPATH 執行工作空間的根。當需要切換不同的工作空間時,更新 GOPATH 變量即可。
切換環境變量然后下載代碼:

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

命令最后的三個點的意義,go get 命令下一節會講。

GOPATH 有三個子目錄,分別用于存放不同類型的文件:

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

環境變量 GOROOT 指定 Go 發行版的根目錄,其中提供所有標準庫的包。用戶無須設置 GOROOT,因為默認情況下在安裝 Go 言語的時候會將其設置為安裝路徑。(如果機器上裝了多個版本的Go,就可以通過這個環境變量來切換了吧。不過Go目前需要使用多個版本的問題。

命令 go env 可以查看環境變量。

包的下載

go get 命令可以下載單一的包,也可以使用 ... 符號來下載子目錄或倉庫。并且還會計算并下載所有依賴的包。

讓包使用一個自定義的導入路徑,但是真實的代碼卻是由更通用的站點提供,例如 github。這只需要在頁面的 HTML 中添加如下的元數據,它重定向 go 工具到實際托管地址的 Git 倉庫:

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

go get 指定 -u 參數,將確保命令會訪問所有的包(無論本地是否已經有了)更新到最新版本。如果沒有這個參數,已經存在在本地的包就做任何處理和確認。

包的構建

命令 go build 編譯每一個命令行參數中的包。如果包是一個庫,結果會被丟棄。如果是main包,則會創建可執行程序。
命令 go run 則可以構建之后直接運行。適用于即用即拋型的程序。
第一個不是以 .go 結尾的參數會作為 Go 可執行程序的參數列表的開始。

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

包的文檔化

每一個導出的包成員的聲明以及包聲明自身應該使用文檔注釋來描述它的目的和用途。Go 文檔注釋總是完整的語句,第一行通常是摘要說明,以被注釋者的名稱(比如函數名)開頭。
包聲明的前面的文檔注釋是對整個包進行描述。它可以出現在任何一個文件里,但是每一個包里值能在一個文件開頭寫包的文檔注釋。比較長的包注釋可以使用一個單獨的注釋文件,文件名通常叫 doc.go。

go doc
go doc 工具輸出在命令行上指定的內容的聲明和整個文檔注釋,可以是一個包、一個包成員、一個方法。

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

$ godoc -http :8000

還可以使用 -analysis=type 和 -analysis=pointer 命令行標志參數,用于打開文檔和代碼中關于靜態分析的結果。

內部包

導入路徑中包含 internal 的情況,會被特殊對待。這種包叫內部包,內部包只能被特定范圍內的包導入,就是以這個內部包的父目錄為根的目錄樹中的其他的包。

包的查詢

go list 工具上報可用包的信息。通過簡單的形式,go list 判斷一個包是否存在于工作區目錄中,如果存在就輸出它的導入路徑:

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

go list 命令的參數可以包含 “...” 通配符(類似于通配符星號的作用),用來匹配包的導入路徑中的任意字符串。這可以枚舉當前工作區目錄下的所有的包: go list ... ,輸出的結果實在太多了。
下面是一個指定的目錄中的所有的包:

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

下面則是查找某個主題:

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

這里匹配的并不是包名,而是包的整個導入路徑。這也包括從工作區目錄為根開始的路徑所組成的字符串里的任何內容。

go list 命令獲取每一個包的完整元數據,而不僅僅是導入路徑,并且提供各種對于用戶或者其他工具可訪問的格式。

-json 標記使 go list 以 JSON 格式輸出每一個包的完整記錄:

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": "這是一個只有一個賬戶的并發安全銀行",
        "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"
        ]
}

這里展開介紹其中三個字段的意義:

  1. GoFiles :庫源碼文件或命令源碼文件,就是實際保存產品代碼的文件列表
  2. TestGoFiles :測試源碼文件,都是以以 _test.go 結尾的文件,僅在編譯測試的時候才會使用
  3. XTestGoFiles :外部測試包。也是測試源碼文件,也是 _test.go 結尾,也是在測試過程中使用的。下篇的測試章節會講到

-f 標記可以讓用戶通過 text/temple 包提供的模板語言來定制輸出的格式:

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 的參數中有空格,必須要用引號包起來。而參數的內容中還包含引號,所以這個參數很難寫。這里只給出幾個示例,具體什么規則講不清楚,大概有下面幾點:

  • 首先,這個windows的環境。Linux下沒有這么坑
  • 雙引號內部的特殊符號,需要重復寫兩遍,兩個雙引號表示一個雙引號
  • 單引號內部的特殊符號,不用重復寫兩遍
  • 雙引號前面要轉義,所以在前面要加上斜杠(\)
  • 最后兩個命令,內層用的是撇號(`),所以不要加斜杠轉義

下面的命令輸出標準庫的 compress 子樹中每個包的直接導入記錄:

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 命令對于一次性的交互查詢和構建、測試腳本都非常有用。更多的參數信息,可以通過 go help list 來獲取。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东明县| 黄石市| 普兰县| 资溪县| 德化县| 临猗县| 郸城县| 武宁县| 皮山县| 林州市| 新郑市| 个旧市| 锡林郭勒盟| 扎兰屯市| 朝阳县| 乳源| 子洲县| 昔阳县| 庄河市| 陆河县| 大冶市| 太康县| 东阿县| 萍乡市| 五莲县| 光泽县| 寿光市| 潼南县| 雷山县| 南宁市| 新郑市| 敖汉旗| 尼勒克县| 沁水县| 上饶市| 阿城市| 巴林右旗| 游戏| 会昌县| 东丽区| 阳新县|