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

成都創(chuàng)新互聯(lián)公司是一家專業(yè)從事網(wǎng)站建設(shè)、網(wǎng)絡(luò)營銷、成都小程序開發(fā)、網(wǎng)站運(yùn)營為一體的建站企業(yè);在網(wǎng)站建設(shè)告別千篇一律,告別似曾相識(shí),這一次我們重新定義網(wǎng)站建設(shè),讓您的網(wǎng)站別具一格。響應(yīng)式網(wǎng)站設(shè)計(jì),實(shí)現(xiàn)全網(wǎng)營銷!一站適應(yīng)多終端,一樣的建站,不一樣的體驗(yàn)!
使用
go generate命令時(shí)有以下幾點(diǎn)需要注意:
- 該特殊注釋必須在 .go 源碼文件中;
- 每個(gè)源碼文件可以包含多個(gè) generate 特殊注釋;
- 運(yùn)行
go generate命令時(shí),才會(huì)執(zhí)行特殊注釋后面的命令; - 當(dāng)
go generate命令執(zhí)行出錯(cuò)時(shí),將終止程序的運(yùn)行; - 特殊注釋必須以
//go:generate開頭,雙斜線后面沒有空格。
在下面這些場景下,我們會(huì)使用
go generate命令:
- yacc:從 .y 文件生成 .go 文件;
- protobufs:從 protocol buffer 定義文件(.proto)生成 .pb.go 文件;
- Unicode:從 UnicodeData.txt 生成 Unicode 表;
- HTML:將 HTML 文件嵌入到 go 源碼;
- bindata:將形如 JPEG 這樣的文件轉(zhuǎn)成 go 代碼中的字節(jié)數(shù)組。
再比如:
- string 方法:為類似枚舉常量這樣的類型生成 String() 方法;
- 宏:為既定的泛型包生成特定的實(shí)現(xiàn),比如用于 ints 的 sort.Ints。
go generate命令格式如下所示:
go generate [-run regexp] [-n] [-v] [-x] [command] [build flags] [file.go... | packages]
參數(shù)說明如下:
- -run 正則表達(dá)式匹配命令行,僅執(zhí)行匹配的命令;
- -v 輸出被處理的包名和源文件名;
- -n 顯示不執(zhí)行命令;
- -x 顯示并執(zhí)行命令;
- command 可以是在環(huán)境變量 PATH 中的任何命令。
執(zhí)行
go generate命令時(shí),也可以使用一些環(huán)境變量,如下所示:
- $GOARCH 體系架構(gòu)(arm、amd64 等);
- $GOOS 當(dāng)前的 OS 環(huán)境(linux、windows 等);
- $GOFILE 當(dāng)前處理中的文件名;
- $GOLINE 當(dāng)前命令在文件中的行號(hào);
- $GOPACKAGE 當(dāng)前處理文件的包名;
- $DOLLAR 固定的
$,不清楚具體用途。
【示例 1】假設(shè)我們有一個(gè) 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命令,輸出結(jié)果如下:
go generate -x
go run main.go
http://c.biancheng.net/golang/
go version
go version go1.13.6 windows/amd64
通過運(yùn)行結(jié)果可以看出
//go:generate之后的命令成功運(yùn)行了,命令中使用的
-x參數(shù)是為了將執(zhí)行的具體命令同時(shí)打印出來。
下面通過 stringer 工具來演示一下
go generate命令的使用。
stringer 并不是Go語言自帶的工具,需要手動(dòng)安裝。我們可以通過下面的命令來安裝 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 工具實(shí)現(xiàn) String() 方法:
首先,在項(xiàng)目目錄下新建一個(gè) 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 文件所在的目錄下運(yùn)行
go generate命令。
執(zhí)行成功后沒有任何提示信息,但會(huì)在當(dāng)前目錄下面生成一個(gè) pill_string.go 文件,文件中實(shí)現(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]]
} 當(dāng)前標(biāo)題:創(chuàng)新互聯(lián)GO教程:gogenerate命令——在編譯前自動(dòng)化生成某類代碼
新聞來源:http://m.5511xx.com/article/cdogpgs.html


咨詢
建站咨詢
