日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)GO教程:gogenerate命令——在編譯前自動(dòng)化生成某類代碼

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