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

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

新聞中心

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

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