|
|
|
|
@@ -21,6 +21,10 @@
|
|
|
|
|
<link rel="stylesheet" href="../gitbook/style.css">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="../gitbook/plugins/gitbook-plugin-katex/katex.min.css">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="../gitbook/plugins/gitbook-plugin-highlight/website.css">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -44,7 +48,7 @@
|
|
|
|
|
<body>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="book" data-level="10.7" data-chapter-title="工具" data-filepath="ch10/ch10-07.md" data-basepath=".." data-revision="Fri Dec 25 2015 12:32:44 GMT+0800 (中国标准时间)">
|
|
|
|
|
<div class="book" data-level="10.7" data-chapter-title="工具" data-filepath="ch10/ch10-07.md" data-basepath=".." data-revision="Mon Dec 28 2015 16:03:52 GMT+0800 (中国标准时间)">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="book-summary">
|
|
|
|
|
@@ -238,7 +242,7 @@
|
|
|
|
|
|
|
|
|
|
<b>1.5.</b>
|
|
|
|
|
|
|
|
|
|
穫取URL
|
|
|
|
|
獲取URL
|
|
|
|
|
</a>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -253,7 +257,7 @@
|
|
|
|
|
|
|
|
|
|
<b>1.6.</b>
|
|
|
|
|
|
|
|
|
|
併發穫取多個URL
|
|
|
|
|
併發獲取多個URL
|
|
|
|
|
</a>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -802,7 +806,7 @@
|
|
|
|
|
|
|
|
|
|
<b>5.10.</b>
|
|
|
|
|
|
|
|
|
|
Recover捕穫異常
|
|
|
|
|
Recover捕獲異常
|
|
|
|
|
</a>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -1315,7 +1319,7 @@
|
|
|
|
|
|
|
|
|
|
<b>8.9.</b>
|
|
|
|
|
|
|
|
|
|
併發的退齣
|
|
|
|
|
併發的退出
|
|
|
|
|
</a>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -1834,7 +1838,7 @@
|
|
|
|
|
|
|
|
|
|
<b>12.7.</b>
|
|
|
|
|
|
|
|
|
|
穫取結構體字段標識
|
|
|
|
|
獲取結構體字段標識
|
|
|
|
|
</a>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -2022,7 +2026,7 @@
|
|
|
|
|
<h2 id="107-工具">10.7. 工具</h2>
|
|
|
|
|
<p>本章剩下的部分將討論Go工具箱的特性, 包括如何 下載, 格式化, 構建, 測試 和 安裝 Go 程序.</p>
|
|
|
|
|
<p>Go的工具箱集合了一繫列的功能到一個命令集. 它可以看作是一個包管理器(類似於Linux中的apt和rpm工具), 用於包的査詢, 計算的包依賴關繫, 從遠程版本控製繫統和下載它們等任務. 它也是一個構建繫統, 計算文件的依賴關繫, 然後調用編譯器, 滙編器 和 連接器 構建程序, 雖然它故意被設計成沒有標準的make命令那麽複雜. 它也是一個測試驅動程序, 我們在第11章討論測試話題.</p>
|
|
|
|
|
<p>Go工具箱的命令有着類似"瑞士軍刀"的風格, 帶着一打子的子命令, 有一些我們經常用到, 例如 get, run, build, 和 fmt 等. 你可以運行 <code>go help</code> 命令査看內置的溫度, 爲了査詢方便, 我們列齣了最常用的命令:</p>
|
|
|
|
|
<p>Go工具箱的命令有着類似"瑞士軍刀"的風格, 帶着一打子的子命令, 有一些我們經常用到, 例如 get, run, build, 和 fmt 等. 你可以運行 <code>go help</code> 命令査看內置的溫度, 爲了査詢方便, 我們列出了最常用的命令:</p>
|
|
|
|
|
<pre><code>$ go
|
|
|
|
|
...
|
|
|
|
|
build compile packages and dependencies
|
|
|
|
|
@@ -2079,14 +2083,14 @@ GOOS="darwin"
|
|
|
|
|
...
|
|
|
|
|
</code></pre><h3 id="1072-下載包">10.7.2. 下載包</h3>
|
|
|
|
|
<p>使用Go工具, 不僅可以根據包導入路徑找到本地工作區的包, 甚至可以從互聯網上找到和更新包.</p>
|
|
|
|
|
<p>使用命令 <code>go get</code> 可以下載一個單一的包或者用 <code>...</code> 下載整個子目録里面的每個包. Go工具同時計算併下載所依賴的每個包, 這也是前一個例子中 golang.org/x/net/html 自動齣現在本地工作區目録的原因.</p>
|
|
|
|
|
<p>一旦 <code>go get</code> 命令下載了包, 然後就是安裝包或包對應的命令. 我們將在下一節再關註它的細節, 現在隻是展示下整個過程是如何的簡單. 第一個命令是穫取 golint 工具, 用於檢測Go源代碼的編程風格是否有問題. 第二個命令是用 golint 對 2.6.2節的 gopl.io/ch2/popcount 包代碼進行編碼風格檢査. 它友好地報告了忘記了包的文檔:</p>
|
|
|
|
|
<p>使用命令 <code>go get</code> 可以下載一個單一的包或者用 <code>...</code> 下載整個子目録里面的每個包. Go工具同時計算併下載所依賴的每個包, 這也是前一個例子中 golang.org/x/net/html 自動出現在本地工作區目録的原因.</p>
|
|
|
|
|
<p>一旦 <code>go get</code> 命令下載了包, 然後就是安裝包或包對應的命令. 我們將在下一節再關註它的細節, 現在隻是展示下整個過程是如何的簡單. 第一個命令是獲取 golint 工具, 用於檢測Go源代碼的編程風格是否有問題. 第二個命令是用 golint 對 2.6.2節的 gopl.io/ch2/popcount 包代碼進行編碼風格檢査. 它友好地報告了忘記了包的文檔:</p>
|
|
|
|
|
<pre><code>$ go get github.com/golang/lint/golint
|
|
|
|
|
$ $GOPATH/bin/golint gopl.io/ch2/popcount
|
|
|
|
|
src/gopl.io/ch2/popcount/main.go:1:1:
|
|
|
|
|
package comment should be of the form "Package popcount ..."
|
|
|
|
|
</code></pre><p><code>go get</code> 命令支持當前流行的託管網站 GitHub, Bitbucket, 和 Launchpad, 可以直接從它們的版本控製繫統請求代碼. 對於其他的網站, 你可能需要指定版本控製繫統的具體路徑和協議, 例如 Git 或 Mercurial. 運行 <code>go help importpath</code> 穫取更新的信息.</p>
|
|
|
|
|
<p><code>go get</code> 穫取的代碼是眞實的本地存儲倉庫, 不僅僅隻是複製文件, 因此你依然可以使用版本管理工具比較本地代碼的變更, 或者切換到其他的版本. 例如 golang.org/x/net 目録對應一個 Git 倉庫:</p>
|
|
|
|
|
</code></pre><p><code>go get</code> 命令支持當前流行的託管網站 GitHub, Bitbucket, 和 Launchpad, 可以直接從它們的版本控製繫統請求代碼. 對於其他的網站, 你可能需要指定版本控製繫統的具體路徑和協議, 例如 Git 或 Mercurial. 運行 <code>go help importpath</code> 獲取更新的信息.</p>
|
|
|
|
|
<p><code>go get</code> 獲取的代碼是眞實的本地存儲倉庫, 不僅僅隻是複製文件, 因此你依然可以使用版本管理工具比較本地代碼的變更, 或者切換到其他的版本. 例如 golang.org/x/net 目録對應一個 Git 倉庫:</p>
|
|
|
|
|
<pre><code>$ cd $GOPATH/src/golang.org/x/net
|
|
|
|
|
$ git remote -v
|
|
|
|
|
origin https://go.googlesource.com/net (fetch)
|
|
|
|
|
@@ -2098,9 +2102,9 @@ $ ./fetch https://golang.org/x/net/html | grep go-import
|
|
|
|
|
content="golang.org/x/net git https://go.googlesource.com/net">
|
|
|
|
|
</code></pre><p>如果指定 <code>-u</code> 命令行標誌參數, <code>go get</code> 將確保所有的包和依賴的包的版本都是最新的, 然後編譯和安裝它們. 如果不包含該標誌參數, 如果包已經在本地存在, 那麽將不會被更新.</p>
|
|
|
|
|
<p><code>go get -u</code> 命令隻是簡單地保證每個包是最新版本, 如果你是第一次下載則比較很方便的; 但是如果是發布程序則可能是不合適的, 因爲本地程序可能需要對依賴的包做精確的版本依賴管理. 通常的解決方案是使用 vendor 目録存儲固定版本的代碼, 對本地依賴的包的版本更新也是謹慎和持續可控的. 在 Go 1.5 之前, 一般需要脩改包的導入路徑, 所以複製後 golang.org/x/net/html 導入路徑可能會變爲 gopl.io/vendor/golang.org/x/net/html. 最新的Go工具已經支持 vendor 特性, 但限於篇幅這里併不討論細節. 不過可以通過 <code>go help gopath</code> 目録査看 Vendor 目録的幫助.</p>
|
|
|
|
|
<p><strong>練習 10.3:</strong> 從 <a href="http://gopl.io/ch1/helloworld?go-get=1" target="_blank">http://gopl.io/ch1/helloworld?go-get=1</a> 穫取內容, 査看本書的代碼的眞實託管的網址(<code>go get</code>請求HTML頁面時包含了 <code>go-get</code> 參數, 以區别普通的瀏覽器請求.)</p>
|
|
|
|
|
<p><strong>練習 10.3:</strong> 從 <a href="http://gopl.io/ch1/helloworld?go-get=1" target="_blank">http://gopl.io/ch1/helloworld?go-get=1</a> 獲取內容, 査看本書的代碼的眞實託管的網址(<code>go get</code>請求HTML頁面時包含了 <code>go-get</code> 參數, 以區别普通的瀏覽器請求.)</p>
|
|
|
|
|
<h3 id="1073-構建包">10.7.3. 構建包</h3>
|
|
|
|
|
<p><code>go build</code> 命令編譯參數指定的每個包. 如果包是一個庫, 則忽略輸齣結果; 這可以用於檢測包的可以正確編譯的.
|
|
|
|
|
<p><code>go build</code> 命令編譯參數指定的每個包. 如果包是一個庫, 則忽略輸出結果; 這可以用於檢測包的可以正確編譯的.
|
|
|
|
|
如果包的名字是 main, <code>go build</code> 將調用連接器在當前目録創建一個可執行程序; 導入路徑的最後一段作爲可執行程序的名字.</p>
|
|
|
|
|
<p>因爲每個目録隻包含一個包, 因此每個可執行程序後者叫Unix術語中的命令, 會要求放到一個獨立的目録. 這些目録有時候會放在名叫 cmd 目録的子目録下面, 例如用於提供Go文檔服務的 golang.org/x/tools/cmd/godoc 命令 (§10.7.4).</p>
|
|
|
|
|
<p>每個包可以由它們的導入路徑指定, 就像前面看到的那樣, 或者有一個相對目録的路徑知道, 必鬚以 <code>.</code> 或 <code>..</code> 開頭. 如果沒有指定參數, 那麽默認指定爲當前的目録. 下面的命令用於構建同一個包, 雖然它們的寫法各不相同:</p>
|
|
|
|
|
@@ -2137,8 +2141,8 @@ $ ./quoteargs one "two three" four\ five
|
|
|
|
|
</code></pre><p>第一行的參數列表中第一個不是以 .go 結尾的將作爲可執行程序的參數運行.</p>
|
|
|
|
|
<p>默認情況下, <code>go build</code> 命令構建指定的包和它依賴的包, 然後丟棄所有除了最後的可執行文件之外的中間編譯結果. 依賴分析和編譯都是很快的, 但是隨着項目增加到幾十個包和成韆上萬行代碼, 依賴關繫分析和編譯時間的消耗將變的可觀, 可能需要幾秒種, 卽使這些依賴項沒有改變.</p>
|
|
|
|
|
<p><code>go install</code> 命令和 <code>go build</code> 命令很相似, 但是它保存每個包的編譯成果, 而不是將它們都丟棄. 被編譯的包被保存到 $GOPATH/pkg 目録下和 src 目録對應, 可執行程序被保存到 $GOPATH/bin 目録. (很多用戶將 $GOPATH/bin 添加到可執行程序的蒐索列表中.) 還有, <code>go install</code> 命令和 <code>go build</code> 命令都不會重新編譯沒有發生變化的包, 這可以使後續構建更快捷. 爲了方便, <code>go build -i</code> 將安裝每個目標所依賴的包.</p>
|
|
|
|
|
<p>因爲編譯對應不同的操作繫統平颱和CPU架構, <code>go install</code> 會將編譯結果安裝到 GOOS 和 GOARCH 對應的目録. 例如, 在 Mac 繫統 golang.org/x/net/html 包將被安裝到 $GOPATH/pkg/darwin_amd64 目録下的 golang.org/x/net/html.a 文件.</p>
|
|
|
|
|
<p>針對不同操作繫統或CPU的交叉構建也是很簡單的. 隻需要設置好目標對應的GOOS 和 GOARCH, 然後運行構建目録卽可. 下面交叉編譯的程序將輸齣它在編譯時操作繫統和CPU類型:</p>
|
|
|
|
|
<p>因爲編譯對應不同的操作繫統平台和CPU架構, <code>go install</code> 會將編譯結果安裝到 GOOS 和 GOARCH 對應的目録. 例如, 在 Mac 繫統 golang.org/x/net/html 包將被安裝到 $GOPATH/pkg/darwin_amd64 目録下的 golang.org/x/net/html.a 文件.</p>
|
|
|
|
|
<p>針對不同操作繫統或CPU的交叉構建也是很簡單的. 隻需要設置好目標對應的GOOS 和 GOARCH, 然後運行構建目録卽可. 下面交叉編譯的程序將輸出它在編譯時操作繫統和CPU類型:</p>
|
|
|
|
|
<pre><code class="lang-Go">gopl.io/ch10/cross
|
|
|
|
|
|
|
|
|
|
<span class="hljs-keyword">func</span> main() {
|
|
|
|
|
@@ -2152,23 +2156,23 @@ darwin amd64
|
|
|
|
|
$ GOARCH=386 go build gopl.io/ch10/cross
|
|
|
|
|
$ ./cross
|
|
|
|
|
darwin 386
|
|
|
|
|
</code></pre><p>有些包可能需要針對不同平颱和處理器類型輸齣不同版本的代碼, 以便於處理底層的可移植性問題或提供爲一些特點代碼提供優化. 如果一個文件名包含了一個操作繫統或處理器類型名字, 例如 net_linux.go 或 asm_amd64.s, Go工具將隻在對應的平颱編譯這些文件. 還有一個特别的構建註釋註釋可以提供更多的構建控製. 例如, 文件中如果包含下面的註釋:</p>
|
|
|
|
|
</code></pre><p>有些包可能需要針對不同平台和處理器類型輸出不同版本的代碼, 以便於處理底層的可移植性問題或提供爲一些特點代碼提供優化. 如果一個文件名包含了一個操作繫統或處理器類型名字, 例如 net_linux.go 或 asm_amd64.s, Go工具將隻在對應的平台編譯這些文件. 還有一個特别的構建註釋註釋可以提供更多的構建控製. 例如, 文件中如果包含下面的註釋:</p>
|
|
|
|
|
<pre><code class="lang-Go"><span class="hljs-comment">// +build linux darwin</span>
|
|
|
|
|
</code></pre>
|
|
|
|
|
<p>在包聲明的前面(含包的註釋), 告訴 <code>go build</code> 隻在針對 Linux 或 Mac OS X 是纔編譯這個文件. 下面的構建註釋表示不編譯這個文件:</p>
|
|
|
|
|
<p>在包聲明的前面(含包的註釋), 告訴 <code>go build</code> 隻在針對 Linux 或 Mac OS X 是才編譯這個文件. 下面的構建註釋表示不編譯這個文件:</p>
|
|
|
|
|
<pre><code class="lang-Go"><span class="hljs-comment">// +build ignore</span>
|
|
|
|
|
</code></pre>
|
|
|
|
|
<p>For more details, see the Build Constraints section of the go/build package’s documentation:</p>
|
|
|
|
|
<p>更多細節, 可以參考 go/build 包的構建約束部分的文檔.</p>
|
|
|
|
|
<pre><code>$ go doc go/build
|
|
|
|
|
</code></pre><h3 id="1074-包文檔">10.7.4. 包文檔</h3>
|
|
|
|
|
<p>Go的編碼風格鼓勵爲每個包提供良好的文檔. 包中每個導齣的成員和包聲明前都應該包含添加目的和用法説明的註釋.</p>
|
|
|
|
|
<p>Go的編碼風格鼓勵爲每個包提供良好的文檔. 包中每個導出的成員和包聲明前都應該包含添加目的和用法説明的註釋.</p>
|
|
|
|
|
<p>Go中包文檔註釋一般是完整的句子, 第一行是包的摘要説明, 註釋後僅跟着包聲明語句. 函數的參數或其他的標識符併不需要額外的引號或其他標記註明. 例如, 下面是 fmt.Fprintf 的文檔註釋.</p>
|
|
|
|
|
<pre><code class="lang-Go"><span class="hljs-comment">// Fprintf formats according to a format specifier and writes to w.</span>
|
|
|
|
|
<span class="hljs-comment">// It returns the number of bytes written and any write error encountered.</span>
|
|
|
|
|
<span class="hljs-keyword">func</span> Fprintf(w io.Writer, format <span class="hljs-typename">string</span>, a ...<span class="hljs-keyword">interface</span>{}) (<span class="hljs-typename">int</span>, error)
|
|
|
|
|
</code></pre>
|
|
|
|
|
<p>Fprintf 函數格式化的細節在 fmt 包文檔中描述. 如果註釋後僅跟着包聲明語句, 那註釋對應整個包的文檔. 包文檔對應的註釋隻能有一個(譯註: 其實可以多個, 它們會組合成一個包文檔註釋.), 可以齣現在任何一個源文件中. 如果包的註釋內容比較長, 可以當到一個獨立的文件中; fmt 包註釋就有 300 行之多. 這個專門用於保證包文檔的文件通常叫 doc.go.</p>
|
|
|
|
|
<p>Fprintf 函數格式化的細節在 fmt 包文檔中描述. 如果註釋後僅跟着包聲明語句, 那註釋對應整個包的文檔. 包文檔對應的註釋隻能有一個(譯註: 其實可以多個, 它們會組合成一個包文檔註釋.), 可以出現在任何一個源文件中. 如果包的註釋內容比較長, 可以當到一個獨立的文件中; fmt 包註釋就有 300 行之多. 這個專門用於保證包文檔的文件通常叫 doc.go.</p>
|
|
|
|
|
<p>好的文檔併不需要面面俱到, 文檔本身應該是簡潔但可不忽略的. 事實上, Go的風格喜歡簡潔的文檔, 併且文檔也是需要想代碼一樣維護的. 對於一組聲明語句, 可以同一個精鍊的句子描述, 如果是顯而易見的功能則併不需要註釋.</p>
|
|
|
|
|
<p>在本書中, 隻要空間允許, 我們之前很多包聲明都包含了註釋文檔, 但你可以從標準庫中發現很多更好的例子. 有兩個工具可以幫到你.</p>
|
|
|
|
|
<p><code>go doc</code> 命令打印包的聲明和每個成員的文檔註釋, 下面是整個包的文檔:</p>
|
|
|
|
|
@@ -2208,8 +2212,8 @@ func (dec *Decoder) Decode(v interface{}) error
|
|
|
|
|
<pre><code>$ godoc -http :8000
|
|
|
|
|
</code></pre><p>其中 <code>-analysis=type</code> 和 <code>-analysis=pointer</code> 命令行標誌參數用於打開文檔和代碼中關於靜態分析的結果.</p>
|
|
|
|
|
<h3 id="1075-內部包">10.7.5. 內部包</h3>
|
|
|
|
|
<p>在Go程序中, 包的封裝機製是一個重要的特性. 爲導齣的標識符隻在同一個包內部可以訪問, 導齣的標識符則是面向全世界可見.</p>
|
|
|
|
|
<p>有時候, 一個中間的狀態可能也是有用的, 對於一小部分信任的包是可見的, 但併不是對所有調用者都可見. 例如, 當我們計劃將一個大的包拆分爲很多小的更容易管理的子包, 但是我們併不想將內部的子包結構也完全暴露齣去. 同時, 我們肯呢個還希望在內部子包之間共享一些通用的處理包. 或者我們隻是想實驗一個新包的還併不穩定的接口, 暫時隻暴露給一些受限製的客戶端.</p>
|
|
|
|
|
<p>在Go程序中, 包的封裝機製是一個重要的特性. 爲導出的標識符隻在同一個包內部可以訪問, 導出的標識符則是面向全世界可見.</p>
|
|
|
|
|
<p>有時候, 一個中間的狀態可能也是有用的, 對於一小部分信任的包是可見的, 但併不是對所有調用者都可見. 例如, 當我們計劃將一個大的包拆分爲很多小的更容易管理的子包, 但是我們併不想將內部的子包結構也完全暴露出去. 同時, 我們肯呢個還希望在內部子包之間共享一些通用的處理包. 或者我們隻是想實驗一個新包的還併不穩定的接口, 暫時隻暴露給一些受限製的客戶端.</p>
|
|
|
|
|
<p><img src="../images/ch10-01.png" alt=""></p>
|
|
|
|
|
<p>爲了滿足這些需求, Go構建工具支持包含 internal 名字的路徑段的包導入路徑. 這種包叫 internal 包, 一個 internal 包隻能被有和internal目録有同一個父目録的包所導入. 例如, net/http/internal/chunked 內部包隻能被 net/http/httputil 或 net/http 導入, 但是不能被 net/url 包導入. 但是 net/url 包 可以導入 net/http/httputil.</p>
|
|
|
|
|
<pre><code>net/http
|
|
|
|
|
@@ -2242,7 +2246,7 @@ gopl.io/ch3/surface
|
|
|
|
|
<pre><code>$ go list ...xml...
|
|
|
|
|
encoding/xml
|
|
|
|
|
gopl.io/ch7/xmlselect
|
|
|
|
|
</code></pre><p><code>go list</code> 可以穫取每個包完整的元信息, 而不僅僅隻是導入路徑, 這些信息可以以不同格式提供給用戶. 其中 <code>-json</code> 標誌參數表示用JSON格式打印每個包的元信息.</p>
|
|
|
|
|
</code></pre><p><code>go list</code> 可以獲取每個包完整的元信息, 而不僅僅隻是導入路徑, 這些信息可以以不同格式提供給用戶. 其中 <code>-json</code> 標誌參數表示用JSON格式打印每個包的元信息.</p>
|
|
|
|
|
<pre><code>$ go list -json hash
|
|
|
|
|
{
|
|
|
|
|
"Dir": "/home/gopher/go/src/hash",
|
|
|
|
|
@@ -2268,7 +2272,7 @@ gopl.io/ch7/xmlselect
|
|
|
|
|
"unsafe"
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
</code></pre><p>參數 <code>-f</code> 允許用戶使用 text/template (§4.6) 的模闆語言定義輸齣文本的格式. 下面的命令打印 strconv 包的依賴的包, 然後用 join 模闆函數鏈接爲一行, 用一個空格分隔:</p>
|
|
|
|
|
</code></pre><p>參數 <code>-f</code> 允許用戶使用 text/template (§4.6) 的模闆語言定義輸出文本的格式. 下面的命令打印 strconv 包的依賴的包, 然後用 join 模闆函數鏈接爲一行, 用一個空格分隔:</p>
|
|
|
|
|
<pre><code>$ go list -f '{{join .Deps " "}}' strconv
|
|
|
|
|
errors math runtime unicode/utf8 unsafe
|
|
|
|
|
</code></pre><p>譯註: 上面的命令在 Windows 的命令行運行會遇到 <code>template: main:1: unclosed action</code> 的錯誤. 産生錯誤的原因是因爲命令行對里面的 <code>" "</code> 參數進行轉義了. 按照下面的方法解決轉義字符串的問題:</p>
|
|
|
|
|
@@ -2284,7 +2288,7 @@ compress/zlib -> bufio compress/flate errors fmt hash hash/adler32 io
|
|
|
|
|
<pre><code>$ go list -f "{{.ImportPath}} -> {{join .Imports \" \"}}" compress/...
|
|
|
|
|
</code></pre><p>go list 命令對於一次性的交互式査詢或自動化構建和測試腳本都很有幫助. 我們將在 11.2.4節 中再次使用它. 更多的信息, 包括可設置的字段和意義, 可以用 <code>go help list</code> 命令査看.</p>
|
|
|
|
|
<p>在本章, 我們解釋了Go工具箱除了測試命令之外的所有重要的命令. 在下一章, 我們將看到如何用 <code>go test</code> 命令去測試Go程序.</p>
|
|
|
|
|
<p><strong>練習10.4:</strong> 創建一個工具, 根據命令行指定的參數, 報告工作區所有依賴指定包的其他包集合. 提示: 你需要運行 <code>go list</code> 命令兩次, 一次用於初始化包, 一次用於所有包. 你可能需要用 encoding/json (§4.5) 包來分析輸齣的 JSON 格式的信息.</p>
|
|
|
|
|
<p><strong>練習10.4:</strong> 創建一個工具, 根據命令行指定的參數, 報告工作區所有依賴指定包的其他包集合. 提示: 你需要運行 <code>go list</code> 命令兩次, 一次用於初始化包, 一次用於所有包. 你可能需要用 encoding/json (§4.5) 包來分析輸出的 JSON 格式的信息.</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</section>
|
|
|
|
|
@@ -2316,7 +2320,7 @@ compress/zlib -> bufio compress/flate errors fmt hash hash/adler32 io
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
require(["gitbook"], function(gitbook) {
|
|
|
|
|
var config = {"highlight":{},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"fontsettings":{"theme":"white","family":"sans","size":2}};
|
|
|
|
|
var config = {"katex":{},"highlight":{},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"fontsettings":{"theme":"white","family":"sans","size":2}};
|
|
|
|
|
gitbook.start(config);
|
|
|
|
|
});
|
|
|
|
|
</script>
|
|
|
|
|
|