真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

gogenerate命令怎么使用

本篇內(nèi)容介紹了“go generate命令怎么使用”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

成都創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的崇左網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

“go generate”命令的作用是在編譯前自動化生成某類代碼;它常用于自動生成代碼,它可以在代碼編譯之前根據(jù)源代碼生成代碼。當(dāng)運(yùn)行“go generate”命令時,它將掃描與當(dāng)前包相關(guān)的源代碼文件,找出所有包含“//go:generate”的特殊注釋,提取并執(zhí)行該特殊注釋后面的命令。

Go語言提供了一系列強(qiáng)大的工具,靈活使用這些工具,能夠讓我們的項目開發(fā)更加容易,工具集包含如下。

bug         start a bug report
build       compile packages and dependencies
clean       remove object files and cached files
doc         show documentation for package or symbol
env         print Go environment information
fix         update packages to use new APIs
fmt         gofmt (reformat) package sources
generate    generate Go files by processing source
get         add dependencies to current module and install them
install     compile and install packages and dependencies
list        list packages or modules
mod         module maintenance
run         compile and run Go program
test        test packages
tool        run specified go tool
version     print Go version
vet         report likely mistakes in packages

工具的源碼位于$GOPATH/src/cmd/internal,本篇文章主要討論Go工具generate。

go語言自動化工具

go generate命令是在Go語言 1.4 版本里面新添加的一個命令,常用于自動生成代碼,它可以在代碼編譯之前根據(jù)源代碼生成代碼。當(dāng)運(yùn)行g(shù)o generate時,它將掃描與當(dāng)前包相關(guān)的源代碼文件,找出所有包含"http:// go:generate"的注釋語句,提取并執(zhí)行該注釋后的命令,命令為可執(zhí)行程序。該過程類似于調(diào)用執(zhí)行shell腳本。

使用方法

  • 添加特殊注釋

//go:generate command argument...

  • 執(zhí)行g(shù)enerate命令

$ go generate [-run regexp] [-n] [-v] [-x] [build flags] [file.go... | packages]

注意事項

  • 該特殊注釋必須包含在.go源碼文件中。

  • 每個源碼文件可以包含多個generate特殊注釋。

  • go generate不會被類似go build,go get,go test等命令觸發(fā)執(zhí)行,必須由開發(fā)者顯式使用。

  • 命令執(zhí)行是串行的,如果出錯,后續(xù)命令不再執(zhí)行。

  • 特殊注釋必須以“//go:generate”開頭,雙斜線之后沒有空格。

  • 執(zhí)行命令必須是系統(tǒng)PATH(echo $PATH)下的可執(zhí)行程序。

使用示例

package mainimport "fmt"http://go:generate echo GoGoGo!//go:generate go run main.go//go:generate echo $GOARCH $GOOS $GOFILE $GOLINE $GOPACKAGEfunc main() {
 fmt.Println("go rum main.go!")}

執(zhí)行g(shù)o generate命令

$ go generate
GoGoGo!go rum main.go!amd64 darwin main.go 7 main

為枚舉常量實現(xiàn)String方法

看完上述generate的簡單介紹,可能讀者并沒有感受到該工具的強(qiáng)大之處,小菜刀提供一個該工具的經(jīng)典應(yīng)用場景:為枚舉常量實現(xiàn)String方法。

這里需要提及官方的另外一個工具stringer,它可以自動為整數(shù)常量集編寫String()方法。由于stringer并不在Go官方發(fā)行版的工具集里,我們需要自行安裝,執(zhí)行如下命令。

go get golang.org/x/tools/cmd/stringer

這里引用stringer文檔中的一個示例。代碼如下,其定義了一組不同Pill類型的整數(shù)常量。

package painkillertype Pill intconst (
    Placebo Pill = iota
    Aspirin
    Ibuprofen
    Paracetamol
    Acetaminophen = Paracetamol)

為了進(jìn)行調(diào)試或者其他原因,我們希望這些常量能夠打印出來,這意味著Pill要有一個帶有簽名的方法。

func (p Pill) String() string

要實現(xiàn)它,非常簡單。

func (p Pill) String() string {
    switch p {
    case Placebo:
        return "Placebo"
    case Aspirin:
        return "Aspirin"
    case Ibuprofen:
        return "Ibuprofen"
    case Paracetamol: // == Acetaminophen
        return "Paracetamol"
    }
    return fmt.Sprintf("Pill(%d)", p)}

試想,如果我們的Pill名單里新增了一批藥品名,每次增加或修改藥品名,在相應(yīng)的簽名函數(shù)里,也都需要進(jìn)行更改。這樣豈不是很麻煩且很可能遺漏或出錯?這時,我們可以通過 go generate + stringer的方案解決該問題。很簡單,只需在定義Pill的代碼中,增加一句注釋語句即可。

//go:generate stringer -type=Pill

上面的命令,代表運(yùn)行stringer工具來為Pill類型生成String方法,默認(rèn)輸出到pill_string.go文件中,執(zhí)行如下。

$ go generate
$ cat pill_string.go
// Code generated by stringer -type Pill pill.go; DO NOT EDIT.

package painkillerimport "fmt"const _Pill_name = "PlaceboAspirinIbuprofenParacetamol"var _Pill_index = [...]uint8{0, 7, 14, 23, 34}func (i Pill) String() string {
    if i < 0 || i+1 >= Pill(len(_Pill_index)) {
        return fmt.Sprintf("Pill(%d)", i)
    }
    return _Pill_name[_Pill_index[i]:_Pill_index[i+1]]}

這樣,每次我們對Pill類型有修改時,我們所需要做的就是運(yùn)行以下語句即可。

$ go generate

當(dāng)然,你要是覺得這樣麻煩,或者擔(dān)心忘記執(zhí)行g(shù)enerate語句。那么,可以將go generate語句寫入Makefile之中,置于go build命令之前,實現(xiàn)代碼生成與編譯的自動化。

值得一提的是,在Go源碼文檔中,大量采用了go generate+stringer的方案實現(xiàn)對枚舉常量的String方法。在小菜刀本機(jī)Go 1.14.1的源碼下,一共有23處使用,具體如下。

go generate命令怎么使用

“go generate命令怎么使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!


名稱欄目:gogenerate命令怎么使用
標(biāo)題鏈接:http://weahome.cn/article/jigcjj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部