久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

go generate命令的作用是什么

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

go generate命令的作用是什么

本教程操作環(huán)境:windows7系統(tǒng)、GO 1.18版本、Dell G3電腦。

Go語(yǔ)言提供了一系列強(qiáng)大的工具,靈活使用這些工具,能夠讓我們的項(xiàng)目開(kāi)發(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
登錄后復(fù)制

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

go語(yǔ)言自動(dòng)化工具


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

使用方法

  • 添加特殊注釋

//go:generate command argument...
登錄后復(fù)制

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

$ go generate [-run regexp] [-n] [-v] [-x] [build flags] [file.go... | packages]
登錄后復(fù)制

注意事項(xiàng)

  • 該特殊注釋必須包含在.go源碼文件中。
  • 每個(gè)源碼文件可以包含多個(gè)generate特殊注釋。
  • go generate不會(huì)被類似go build,go get,go test等命令觸發(fā)執(zhí)行,必須由開(kāi)發(fā)者顯式使用。
  • 命令執(zhí)行是串行的,如果出錯(cuò),后續(xù)命令不再執(zhí)行。
  • 特殊注釋必須以“//go:generate”開(kāi)頭,雙斜線之后沒(méi)有空格。
  • 執(zhí)行命令必須是系統(tǒng)PATH(echo $PATH)下的可執(zhí)行程序。

使用示例

package mainimport "fmt"//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!")}
登錄后復(fù)制

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

$ go generate GoGoGo!go rum main.go!amd64 darwin main.go 7 main
登錄后復(fù)制

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


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

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

go get golang.org/x/tools/cmd/stringer
登錄后復(fù)制

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

package painkillertype Pill intconst (     Placebo Pill = iota     Aspirin     Ibuprofen     Paracetamol     Acetaminophen = Paracetamol)
登錄后復(fù)制

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

func (p Pill) String() string
登錄后復(fù)制

要實(shí)現(xiàn)它,非常簡(jiǎ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)}
登錄后復(fù)制

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

//go:generate stringer -type=Pill
登錄后復(fù)制

上面的命令,代表運(yùn)行stringer工具來(lái)為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]]}
登錄后復(fù)制

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

$ go generate
登錄后復(fù)制

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

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

go generate命令的作用是什么

總結(jié)


本文主要介紹generate是什么,能做什么,如果想深入理解其內(nèi)在實(shí)現(xiàn)邏輯,可以去看Go源碼中生成代碼的詳細(xì)過(guò)程,例如sort包下通過(guò)genzfunc.go實(shí)現(xiàn)zfuncversion.go的生成。在Go源碼寶庫(kù)中,可以找到很多相似的實(shí)現(xiàn)邏輯,參照如下。

go generate命令的作用是什么

它們利用Go編譯器提供的庫(kù),包括定義抽象語(yǔ)法樹(shù)的 go/ast、解析抽象語(yǔ)法樹(shù)的go/parser、解析用于格式化代碼的 go/format、用于Go詞法標(biāo)記的go/token等。解析源文件并按照已有的模板生成新的代碼,這一過(guò)程和Web 服務(wù)中利用模板生成 HTML 文件類似。

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
91精品一区国产高清在线gif | 久久久久久久久丰满| 欧美国产不卡| 国产剧情在线观看一区| 青青国产精品| 久久不见久久见免费视频7 | 91亚洲国产高清| 伊人久久在线| 日韩中文影院| 国产精品xx| 亚洲风情在线资源| 精品日韩视频| 亚洲视频综合| 免费国产自线拍一欧美视频| 亚洲精品伦理| 国产欧美大片| yellow在线观看网址| 成人看片网站| 香蕉视频成人在线观看| 日韩国产欧美在线视频| 国产精品99精品一区二区三区∴ | 久久青草久久| 欧美在线亚洲综合一区| 久久高清国产| 国产亚洲久久| 久久久久久色| 电影91久久久| 国产一区欧美| 日韩欧美另类中文字幕| 欧美激情视频一区二区三区免费 | 久久精品女人| 亚洲永久av| 亚洲精品97| 日韩中文字幕| 久久久国产精品网站| a日韩av网址| 国产精品日韩| 日韩1区2区3区| 日韩综合在线| 午夜一级在线看亚洲| 国产精品扒开腿做爽爽爽软件| 日韩网站中文字幕| 视频一区二区中文字幕| 国产美女撒尿一区二区| 成人午夜精品| 男女性色大片免费观看一区二区 | 开心激情综合| 国产真实久久| 日韩一区二区三区免费视频 | 国产精品99久久免费观看| 色婷婷狠狠五月综合天色拍| 亚洲伊人精品酒店| 久久精品国产网站| 免费黄色成人| 欧美日韩xxxx| 久久高清免费| 国产欧美日韩在线一区二区| 久久久一二三| 欧美伊人久久| 亚洲天堂成人| 国产激情欧美| 麻豆亚洲精品| 麻豆国产在线| 日韩国产在线观看| 日韩精品一区二区三区免费观看| 日本亚洲欧美天堂免费| 久久激情婷婷| 国产精品久久久久av蜜臀| 91精品国产调教在线观看| 日本不卡的三区四区五区| 亚洲精品一区三区三区在线观看| 日本强好片久久久久久aaa| 中文字幕系列一区| 欧美日韩99| 欧美日韩一区二区三区视频播放| 欧美久久久网站| 亚洲精品网址| 国产成人久久精品麻豆二区| 国产精品日韩欧美一区| 国产aⅴ精品一区二区三区久久| 亚洲毛片在线免费| 亚洲成av人片一区二区密柚| 国产美女久久| 免费日韩av| 免费看av不卡| 国产精品大片| 97成人在线| 免费一级片91| 欧美~级网站不卡| 岛国av在线网站| 国产精品激情电影| 四虎精品一区二区免费| 不卡中文一二三区| 欧美gv在线| 久久天堂影院| 国产午夜久久av| 亚洲狼人精品一区二区三区| 黄色不卡一区| 精品日本视频| 青草av.久久免费一区| 伊人久久亚洲影院| 日韩欧美综合| www.51av欧美视频| 久久久91麻豆精品国产一区| 日韩av中文字幕一区二区| 亚洲一区二区网站| 亚洲va中文在线播放免费| 久久免费精品| 国产精品视频3p| 欧美日韩一区二区三区不卡视频 | 蜜臀久久99精品久久久久久9 | 91亚洲人成网污www| 国产精品亚洲欧美一级在线| 日韩欧美2区| 色8久久久久| 蜜桃久久久久久| 黄色免费成人| 亚洲二区三区不卡| 韩日一区二区三区| 久久在线免费| 中文字幕在线视频久| 精品美女在线视频| 精品午夜久久| 国产一区二区三区亚洲| 美女视频网站久久| 久久精品资源| 伊伊综合在线| 在线成人动漫av| 亚洲欧美一区在线| 午夜日韩福利| 国产精品嫩草99av在线| 亚洲作爱视频| 在线日韩成人| 日本不卡视频在线观看| 日韩高清一区在线| 中文一区一区三区免费在线观| 手机精品视频在线观看| 亚洲天堂日韩在线| 日韩av资源网| 美女视频网站久久| 亚洲综合电影| 不卡在线一区| 亚洲区国产区| 国产伦理久久久久久妇女| 美女在线视频一区| 成人国产综合| 婷婷国产精品| 男人天堂欧美日韩| 久久国产欧美日韩精品| 国产aⅴ精品一区二区三区久久| 国产精品成久久久久| 日本精品影院| 热久久国产精品| 国产精品久久久久av蜜臀 | 久久中文在线| 久久久久国产| 在线国产日韩| 你懂的亚洲视频| 日韩中文在线电影| 香蕉久久夜色精品国产| 国产毛片久久久| 日韩在线中文| 免费黄网站欧美| 国产探花在线精品| 岛国av免费在线观看| 欧美日韩国产免费观看视频| 亚洲伊人精品酒店| 精品一区二区三区中文字幕| 亚洲福利国产| 日韩欧美2区| 国产精品99视频| 免播放器亚洲| 精品亚洲a∨一区二区三区18| 婷婷综合社区| 久久国内精品| 亚洲福利久久| 欧美日一区二区三区在线观看国产免| 国产精品蜜芽在线观看| 9国产精品视频| 国产精品大片| 欧美日韩国产在线一区| 国产精品极品国产中出| 九一精品国产| 国产精选一区| 一区在线观看| 国产激情综合| 国产精品女主播一区二区三区| 国产精品红桃| 国产精品美女久久久浪潮软件| 久久av超碰| 视频一区国产视频| 国产一区二区三区四区| 中文字幕亚洲在线观看| 97精品在线| 亚洲免费专区| 999国产精品| 国产精品亚洲产品| 亚洲一区成人| 日韩.com| 欧美日韩一区二区三区四区在线观看 |