2
2
3
3
## Go 命令
4
4
5
- Go 語言自帶有一套完整的命令操作工具 ,你可以透過在命令列中執行 ` go ` 來檢視它們:
5
+ Go 語言自帶有一套完整的命令列工具 ,你可以透過在命令列中執行 ` go ` 來檢視它們:
6
6
7
- ![ ] ( images/1.1.mac.png?raw=true )
7
+ ![ ] ( images/1.1.mac.png )
8
8
9
9
圖 1.3 Go 命令顯示詳細的資訊
10
10
11
- 這些命令對於我們平時編寫的程式碼非常有用,接下來就讓我們瞭解一些常用的命令 。
11
+ 這些命令對於我們平時編寫的程式碼非常有用,接下來就讓我們了解一些常用的命令 。
12
12
13
13
## go build
14
14
35
35
36
36
` go build ` 的時候會選擇性地編譯以系統名結尾的檔案(Linux、Darwin、Windows、Freebsd)。例如 Linux 系統下面編譯只會選擇 array_linux.go 檔案,其它系統命名字尾檔案全部忽略。
37
37
38
- 引數的介紹
38
+ 參數的介紹
39
39
40
40
- ` -o ` 指定輸出的檔名,可以帶上路徑,例如 ` go build -o a/b/c `
41
41
- ` -i ` 安裝相應的套件,編譯+` go install `
42
42
- ` -a ` 更新全部已經是最新的套件的,但是對標準套件不適用
43
- - ` -n ` 把需要執行的編譯命令打印出來 ,但是不執行,這樣就可以很容易的知道底層是如何執行的
43
+ - ` -n ` 把需要執行的編譯命令顯示出來 ,但是不執行,這樣就可以很容易的知道底層是如何執行的
44
44
- ` -p n ` 指定可以並行可執行的編譯數目,預設是 CPU 數目
45
45
- ` -race ` 開啟編譯的時候自動檢測資料競爭的情況,目前只支援 64 位的機器
46
- - ` -v ` 打印出來我們正在編譯的套件名
47
- - ` -work ` 打印出來編譯時候的臨時資料夾名稱 ,並且如果已經存在的話就不要刪除
48
- - ` -x ` 打印出來執行的命令 ,其實就是和` -n ` 的結果類似,只是這個會執行
49
- - ` -ccflags 'arg list' ` 傳遞引數給 5c, 6c, 8c 呼叫
46
+ - ` -v ` 顯示出來我們正在編譯的套件名
47
+ - ` -work ` 顯示出來編譯時候的臨時資料夾名稱 ,並且如果已經存在的話就不要刪除
48
+ - ` -x ` 顯示出來執行的命令 ,其實就是和` -n ` 的結果類似,只是這個會執行
49
+ - ` -ccflags 'arg list' ` 傳遞參數給 5c, 6c, 8c 呼叫
50
50
- ` -compiler name ` 指定相應的編譯器,gccgo 還是 gc
51
51
52
- - ` -gccgoflags 'arg list' ` 傳遞引數給 gccgo 編譯連線呼叫
53
- - ` -gcflags 'arg list' ` 傳遞引數給 5g, 6g, 8g 呼叫
52
+ - ` -gccgoflags 'arg list' ` 傳遞參數給 gccgo 編譯連線呼叫
53
+ - ` -gcflags 'arg list' ` 傳遞參數給 5g, 6g, 8g 呼叫
54
54
- ` -installsuffix suffix ` 為了和預設的安裝套件區別開來,採用這個字首來重新安裝那些依賴的套件,` -race ` 的時候預設已經是` -installsuffix race ` ,大家可以透過` -n ` 命令來驗證
55
- - ` -ldflags 'flag list' ` 傳遞引數給 5l, 6l, 8l 呼叫
55
+ - ` -ldflags 'flag list' ` 傳遞參數給 5l, 6l, 8l 呼叫
56
56
- ` -tags 'tag list' ` 設定在編譯的時候可以適配的那些 tag,詳細的 tag 限制參考裡面的 [ Build Constraints] ( http://golang.org/pkg/go/build/ )
57
57
58
58
## go clean
71
71
MAINFILE(.exe) 由 go build MAINFILE.go 產生
72
72
*.so 由 SWIG 產生
73
73
74
- 我一般都是利用這個命令清除編譯檔案,然後 github 遞交原始碼 ,在本機測試的時候這些編譯檔案都是和系統相關的,但是對於原始碼管理來說沒必要。
74
+ 我一般都是利用這個命令清除編譯檔案,然後 github 提交原始碼 ,在本機測試的時候這些編譯檔案都是和系統相關的,但是對於原始碼管理來說沒必要。
75
75
76
76
$ go clean -i -n
77
77
cd /Users/astaxie/develop/gopath/src/mathapp
78
78
rm -f mathapp mathapp.exe mathapp.test mathapp.test.exe app app.exe
79
79
rm -f /Users/astaxie/develop/gopath/bin/mathapp
80
80
81
- 引數介紹
81
+ 參數介紹
82
82
83
83
- ` -i ` 清除關聯的安裝的套件和可執行檔案,也就是透過 go install 安裝的檔案
84
- - ` -n ` 把需要執行的清除命令打印出來 ,但是不執行,這樣就可以很容易的知道底層是如何執行的
84
+ - ` -n ` 把需要執行的清除命令顯示出來 ,但是不執行,這樣就可以很容易的知道底層是如何執行的
85
85
- ` -r ` 迴圈的清除在 import 中引入的套件
86
86
87
- - ` -x ` 打印出來執行的詳細命令 ,其實就是` -n ` 列印的執行版本
87
+ - ` -x ` 顯示出來執行的詳細命令 ,其實就是` -n ` 列印的執行版本
88
88
89
89
## go fmt
90
90
91
91
有過 C/C++經驗的讀者會知道,一些人經常為程式碼採取 K&R 風格還是 ANSI 風格而爭論不休。在 go 中,程式碼則有標準的風格。由於之前已經有的一些習慣或其它的原因我們常將程式碼寫成 ANSI 風格或者其它更合適自己的格式,這將為人們在閱讀別人的程式碼時新增不必要的負擔,所以 go 強制了程式碼格式(比如左大括號必須放在行尾),不按照此格式的程式碼將不能編譯透過,為了減少浪費在排版上的時間,go 工具集中提供了一個`go fmt`命令 它可以幫你格式化你寫好的程式碼檔案,使你寫程式碼的時候不需要關心格式,你只需要在寫完之後執行`go fmt <檔名>.go`,你的程式碼就被修改成了標準格式,但是我平常很少用到這個命令,因為開發工具裡面一般都帶了儲存時候自動格式化功能,這個功能其實在底層就是呼叫了`go fmt`。接下來的一節我將講述兩個工具,這兩個工具都自帶了儲存檔案時自動化`go fmt`功能。
92
92
93
- 使用 go fmt 命令,其實是呼叫了 gofmt,而且需要引數 -w,否則格式化結果不會寫入檔案。gofmt -w -l src,可以格式化整個專案。
93
+ 使用 go fmt 命令,其實是呼叫了 gofmt,而且需要參數 -w,否則格式化結果不會寫入檔案。gofmt -w -l src,可以格式化整個專案。
94
94
95
- 所以 go fmt 是 gofmt 的上層一個套件裝的命令,我們想要更多的個性化的格式化可以參考 [ gofmt] ( http://golang.org/cmd/gofmt/ )
95
+ 所以 go fmt 是 gofmt 的上層一個封裝命令,如果想要更多的自訂格式化,可以參考 [ gofmt] ( http://golang.org/cmd/gofmt/ )
96
96
97
- gofmt 的引數介紹
97
+ gofmt 的參數介紹
98
98
99
99
- ` -l ` 顯示那些需要格式化的檔案
100
100
- ` -w ` 把改寫後的內容直接寫入到檔案中,而不是作為結果列印到標準輸出。
@@ -116,10 +116,10 @@ gofmt 的引數介紹
116
116
117
117
所以為了` go get ` 能正常工作,你必須確保安裝了合適的原始碼管理工具,並同時把這些命令加入你的 PATH 中。其實` go get ` 支援自訂域名的功能,具體參見` go help remote ` 。
118
118
119
- 引數介紹 :
119
+ 參數介紹 :
120
120
121
121
- ` -d ` 只下載不安裝
122
- - ` -f ` 只有在你包含了` -u ` 引數的時候才有效 ,不讓` -u ` 去驗證 import 中的每一個都已經取得了,這對於本地 fork 的套件特別有用
122
+ - ` -f ` 只有在你包含了` -u ` 參數的時候才有效 ,不讓` -u ` 去驗證 import 中的每一個都已經取得了,這對於本地 fork 的套件特別有用
123
123
- ` -fix ` 在取得原始碼之後先執行 fix,然後再去做其他的事情
124
124
- ` -t ` 同時也下載需要為執行測試所需要的套件
125
125
@@ -130,7 +130,7 @@ gofmt 的引數介紹
130
130
131
131
這個命令在內部實際上分成了兩步操作:第一步是產生結果檔案(可執行檔案或者.a 套件),第二步會把編譯好的結果移到` $GOPATH/pkg ` 或者` $GOPATH/bin ` 。
132
132
133
- 引數支援 ` go build ` 的編譯引數。大家只要記住一個引數 ` -v ` 就好了,這個隨時隨地的可以檢視底層的執行資訊。
133
+ 參數支援 ` go build ` 的編譯參數。大家只要記住一個參數 ` -v ` 就好了,這個隨時隨地的可以檢視底層的執行資訊。
134
134
135
135
## go test
136
136
@@ -141,9 +141,9 @@ gofmt 的引數介紹
141
141
ok compress/gzip 0.033s
142
142
...
143
143
144
- 預設的情況下,不需要任何的引數 ,它會自動把你原始碼套件下面所有 test 檔案測試完畢,當然你也可以帶上引數 ,詳情請參考` go help testflag `
144
+ 預設的情況下,不需要任何的參數 ,它會自動把你原始碼套件下面所有 test 檔案測試完畢,當然你也可以帶上參數 ,詳情請參考` go help testflag `
145
145
146
- 這裡我介紹幾個我們常用的引數 :
146
+ 這裡我介紹幾個我們常用的參數 :
147
147
148
148
- ` -bench regexp ` 執行相應的 benchmarks,例如 ` -bench=. `
149
149
- ` -cover ` 開啟測試覆蓋率
@@ -155,10 +155,11 @@ gofmt 的引數介紹
155
155
156
156
157
157
- ` go tool fix . ` 用來修復以前老版本的程式碼到新版本,例如 go1 之前老版本的程式碼轉化到 go1,例如 API 的變化
158
- - ` go tool vet directory|files ` 用來分析當前目錄的程式碼是否都是正確的程式碼,例如是不是呼叫 fmt.Printf 裡面的引數不正確 ,例如函式裡面提前 return 瞭然後出現了無用程式碼之類別的 。
158
+ - ` go tool vet directory|files ` 用來分析當前目錄的程式碼是否都是正確的程式碼,例如是不是呼叫 fmt.Printf 裡面的參數不正確 ,例如函式裡面提前 return 了然後出現了無用程式碼之類別的 。
159
159
160
160
## go generate
161
- 這個命令是從 Go1.4 開始才設計的,用於在編譯前自動化產生某類別程式碼。` go generate ` 和` go build ` 是完全不一樣的命令,透過分析原始碼中特殊的註釋,然後執行相應的命令。這些命令都是很明確的,沒有任何的依賴在裡面。而且大家在用這個之前心裡面一定要有一個理念,這個` go generate ` 是給你用的,不是給使用你這個套件的人用的,是方便你來產生一些程式碼的。
161
+
162
+ 這個命令是從 Go1.4 開始才設計的,用於在編譯前自動化產生某類別程式碼。` go generate ` 和` go build ` 是完全不一樣的命令,透過分析原始碼中特殊的註釋,然後執行相應的命令。這些命令都是很明確的,沒有任何的依賴在裡面。而且大家在用這個之前心裡面一定要有一個觀念,這個 ` go generate ` 是給你用的,不是給使用你這個套件的人用的,主要是方便你自動產生一些程式碼。
162
163
163
164
這裡我們來舉一個簡單的例子,例如我們經常會使用 ` yacc ` 來產生程式碼,那麼我們常用這樣的命令:
164
165
@@ -201,7 +202,7 @@ gofmt 的引數介紹
201
202
202
203
go run 編譯並執行 Go 程式
203
204
204
- 以上這些工具還有很多引數沒有一一介紹 ,使用者可以使用` go help 命令 ` 取得更詳細的幫助資訊。
205
+ 以上這些工具還有很多參數沒有一一介紹 ,使用者可以使用` go help 命令 ` 取得更詳細的幫助資訊。
205
206
206
207
207
208
## links
0 commit comments