新聞中心
go generate命令是在Go語言 1.4 版本里面新添加的一個命令,當運行該命令時,它將掃描與當前包相關的源代碼文件,找出所有包含
//go:generate的特殊注釋,提取并執(zhí)行該特殊注釋后面的命令。

成都創(chuàng)新互聯(lián)公司是一家專業(yè)從事網(wǎng)站建設、網(wǎng)絡營銷、成都小程序開發(fā)、網(wǎng)站運營為一體的建站企業(yè);在網(wǎng)站建設告別千篇一律,告別似曾相識,這一次我們重新定義網(wǎng)站建設,讓您的網(wǎng)站別具一格。響應式網(wǎng)站設計,實現(xiàn)全網(wǎng)營銷!一站適應多終端,一樣的建站,不一樣的體驗!
使用
go generate命令時有以下幾點需要注意:
- 該特殊注釋必須在 .go 源碼文件中;
- 每個源碼文件可以包含多個 generate 特殊注釋;
- 運行
go generate命令時,才會執(zhí)行特殊注釋后面的命令; - 當
go generate命令執(zhí)行出錯時,將終止程序的運行; - 特殊注釋必須以
//go:generate開頭,雙斜線后面沒有空格。
在下面這些場景下,我們會使用
go generate命令:
- yacc:從 .y 文件生成 .go 文件;
- protobufs:從 protocol buffer 定義文件(.proto)生成 .pb.go 文件;
- Unicode:從 UnicodeData.txt 生成 Unicode 表;
- HTML:將 HTML 文件嵌入到 go 源碼;
- bindata:將形如 JPEG 這樣的文件轉成 go 代碼中的字節(jié)數(shù)組。
再比如:
- string 方法:為類似枚舉常量這樣的類型生成 String() 方法;
- 宏:為既定的泛型包生成特定的實現(xiàn),比如用于 ints 的 sort.Ints。
go generate命令格式如下所示:
go generate [-run regexp] [-n] [-v] [-x] [command] [build flags] [file.go... | packages]
參數(shù)說明如下:
- -run 正則表達式匹配命令行,僅執(zhí)行匹配的命令;
- -v 輸出被處理的包名和源文件名;
- -n 顯示不執(zhí)行命令;
- -x 顯示并執(zhí)行命令;
- command 可以是在環(huán)境變量 PATH 中的任何命令。
執(zhí)行
go generate命令時,也可以使用一些環(huán)境變量,如下所示:
- $GOARCH 體系架構(arm、amd64 等);
- $GOOS 當前的 OS 環(huán)境(linux、windows 等);
- $GOFILE 當前處理中的文件名;
- $GOLINE 當前命令在文件中的行號;
- $GOPACKAGE 當前處理文件的包名;
- $DOLLAR 固定的
$,不清楚具體用途。
【示例 1】假設我們有一個 main.go 文件,內(nèi)容如下:
package main
import "fmt"
//go:generate go run main.go
//go:generate go version
func main() {
fmt.Println("http://c.biancheng.net/golang/")
}
執(zhí)行
go generate -x命令,輸出結果如下:
go generate -x
go run main.go
http://c.biancheng.net/golang/
go version
go version go1.13.6 windows/amd64
通過運行結果可以看出
//go:generate之后的命令成功運行了,命令中使用的
-x參數(shù)是為了將執(zhí)行的具體命令同時打印出來。
下面通過 stringer 工具來演示一下
go generate命令的使用。
stringer 并不是Go語言自帶的工具,需要手動安裝。我們可以通過下面的命令來安裝 stringer 工具。
go get golang.org/x/tools/cmd/stringer
上面的命令需要翻墻。條件不允許的話也可以通過 Github 上的鏡像來安裝,安裝方法如下:
git clone https://github.com/golang/tools/ $GOPATH/src/golang.org/x/tools
go install golang.org/x/tools/cmd/stringer
安裝好的 stringer 工具位于 GOPATH/bin 目錄下,想要正常使用它,需要先將 GOPATH/bin 目錄添加到系統(tǒng)的環(huán)境變量 PATH 中。
【示例 2】使用 stringer 工具實現(xiàn) String() 方法:
首先,在項目目錄下新建一個 painkiller 文件夾,并在該文件夾中創(chuàng)建 painkiller.go 文件,文件內(nèi)容如下:
//go:generate stringer -type=Pill
package painkiller
type Pill int
const (
Placebo Pill = iota
Aspirin
Ibuprofen
Paracetamol
Acetaminophen = Paracetamol
)
然后,在 painkiller.go 文件所在的目錄下運行
go generate命令。
執(zhí)行成功后沒有任何提示信息,但會在當前目錄下面生成一個 pill_string.go 文件,文件中實現(xiàn)了我們需要的 String() 方法,文件內(nèi)容如下:
// Code generated by "stringer -type=Pill"; DO NOT EDIT.
package painkiller
import "strconv"
func _() {
// An "invalid array index" compiler error signifies that the constant values have changed.
// Re-run the stringer command to generate them again.
var x [1]struct{}
_ = x[Placebo-0]
_ = x[Aspirin-1]
_ = x[Ibuprofen-2]
_ = x[Paracetamol-3]
}
const _Pill_name = "PlaceboAspirinIbuprofenParacetamol"
var _Pill_index = [...]uint8{0, 7, 14, 23, 34}
func (i Pill) String() string {
if i < 0 || i >= Pill(len(_Pill_index)-1) {
return "Pill(" + strconv.FormatInt(int64(i), 10) + ")"
}
return _Pill_name[_Pill_index[i]:_Pill_index[i+1]]
} 當前名稱:創(chuàng)新互聯(lián)GO教程:gogenerate命令——在編譯前自動化生成某類代碼
分享網(wǎng)址:http://www.5511xx.com/article/cdogpgs.html


咨詢
建站咨詢
