gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

go generate命令的作用是什么

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

go generate命令的作用是什么

本教程操作環境:windows7系統、GO 1.18版本、Dell G3電腦。

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

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 版本里面新添加的一個命令,常用于自動生成代碼,它可以在代碼編譯之前根據源代碼生成代碼。當運行go generate時,它將掃描與當前包相關的源代碼文件,找出所有包含"// go:generate"的注釋語句,提取并執行該注釋后的命令,命令為可執行程序。該過程類似于調用執行shell腳本。

使用方法

  • 添加特殊注釋

//go:generate command argument...
登錄后復制

  • 執行generate命令

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

注意事項

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

使用示例

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!")}
登錄后復制

執行go generate命令

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

為枚舉常量實現String方法


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

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

go get golang.org/x/tools/cmd/stringer
登錄后復制

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

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

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

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

要實現它,非常簡單。

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名單里新增了一批藥品名,每次增加或修改藥品名,在相應的簽名函數里,也都需要進行更改。這樣豈不是很麻煩且很可能遺漏或出錯?這時,我們可以通過 go generate + stringer的方案解決該問題。很簡單,只需在定義Pill的代碼中,增加一句注釋語句即可。

//go:generate stringer -type=Pill
登錄后復制

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

$ 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類型有修改時,我們所需要做的就是運行以下語句即可。

$ go generate
登錄后復制

當然,你要是覺得這樣麻煩,或者擔心忘記執行generate語句。那么,可以將go generate語句寫入Makefile之中,置于go build命令之前,實現代碼生成與編譯的自動化。

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

go generate命令的作用是什么

總結


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

go generate命令的作用是什么

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

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
毛片一区二区三区四区| 日韩一级片免费视频| 无码aⅴ精品一区二区三区浪潮| 欧美日韩亚洲国产成人| 亚洲高清在线不卡| 中文字幕亚洲影院| 午夜视频在线观| 在线观看av免费观看| 日韩a一级欧美一级| 经典三级在线视频| 成年在线观看视频| 加勒比成人在线| 亚洲熟妇av一区二区三区漫画| 欧美一区二区三区爽大粗免费| 久在线观看视频| 国产精品无码一本二本三本色| 99re在线视频免费观看| 91精品无人成人www| 国内精品国产三级国产aⅴ久| 懂色av一区二区三区四区五区| 热这里只有精品| 一本久道高清无码视频| 成年人免费在线播放| 亚洲人视频在线| 91嫩草国产丨精品入口麻豆| 福利视频一二区| 日本新janpanese乱熟| 亚洲综合婷婷久久| 老司机午夜网站| 任你操这里只有精品| 亚洲精品久久久久久宅男| 激情图片qvod| 久久精品免费网站| 亚洲国产精品无码观看久久| 噼里啪啦国语在线观看免费版高清版| 亚洲成人手机在线观看| 国产二级片在线观看| 一道本在线免费视频| 久青草视频在线播放| 国产aⅴ爽av久久久久| 蜜臀av无码一区二区三区| 五月天开心婷婷| 欧美女人性生活视频| 国产911在线观看| 天美星空大象mv在线观看视频| 欧美日韩dvd| 伊人色在线视频| 亚洲一区二区蜜桃| 播放灌醉水嫩大学生国内精品| 久久久福利影院| 奇米影音第四色| 久久国产色av免费观看| 欧美人成在线观看| www.-级毛片线天内射视视| 爱情岛论坛vip永久入口| 欧美二区在线视频| 999久久欧美人妻一区二区| av中文字幕网址| 中文字幕天天干| 免费涩涩18网站入口| 国产97色在线 | 日韩| 浮妇高潮喷白浆视频| 男女h黄动漫啪啪无遮挡软件| 色91精品久久久久久久久| 在线免费观看av的网站| 久久久国产欧美| www.夜夜爽| 爱爱爱爱免费视频| 欧美成人三级在线播放| 黄色一级片免费的| 亚洲精品中文字幕乱码无线| 日本中文字幕在线不卡| 手机看片日韩国产| 国产激情在线看| 日韩av中文字幕第一页| 蜜桃传媒一区二区三区| 欧美色图色综合| 国产精品wwwww| 免费看黄色一级大片| 久久99爱视频| 日本特级黄色大片| 女人色极品影院| 免费大片在线观看| 亚洲 激情 在线| 五月天激情图片| www国产黄色| 在线能看的av网站| 草草草视频在线观看| 日本网站免费在线观看| 无人在线观看的免费高清视频 | 91福利免费观看| 国产奶头好大揉着好爽视频| 97视频久久久| 色天使在线观看| 国内少妇毛片视频| 亚洲精品视频导航| 青草网在线观看| 中文字幕有码av| 少妇人妻大乳在线视频| 成人亚洲精品777777大片| 欧美 亚洲 视频| 精品www久久久久奶水| 50度灰在线观看| 日本熟妇人妻xxxxx| 国产黄色激情视频| 日本中文字幕二区| 国产精品va无码一区二区| 亚洲综合123| 成人在线激情网| 很污的网站在线观看| www.com黄色片| 国产网站免费在线观看| 国产树林野战在线播放| 免费涩涩18网站入口| 免费毛片小视频| 国产www免费| 乱熟女高潮一区二区在线| 一区二区三区入口| 久久9精品区-无套内射无码| 视色,视色影院,视色影库,视色网| 日本在线观看a| 精品视频免费在线播放| 黄色片免费在线观看视频| 深夜做爰性大片蜜桃| 中文字幕有码av| 国产又大又黄又粗的视频| 又粗又黑又大的吊av| 成年人视频网站免费| 成人在线观看毛片| 激情五月六月婷婷| 久久久99精品视频| 蜜臀在线免费观看| 91手机视频在线| 浴室偷拍美女洗澡456在线| 日韩欧美色视频| 中文字幕国产高清| 一级片黄色免费| 日韩人妻一区二区三区蜜桃视频| 国产在线视频三区| 好色先生视频污| 免费不卡av在线| 免费无码国产v片在线观看| 免费无码av片在线观看| 欧美性久久久久| 最近中文字幕一区二区| gai在线观看免费高清| 青少年xxxxx性开放hg| 亚洲一区 在线播放| 2018日日夜夜| 毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 精品人妻少妇一区二区| 六月丁香激情网| 日韩av一二三四| 中文字幕第66页| 久久久亚洲国产精品| 免费一级特黄录像| avove在线观看| 大肉大捧一进一出好爽视频| 污污视频网站免费观看| 一本二本三本亚洲码| 香港三级韩国三级日本三级| 熟妇人妻无乱码中文字幕真矢织江| 亚洲xxxx2d动漫1| 免费超爽大片黄| 中文字幕av不卡在线| avav在线播放| 国产一二三区av| 欧美亚洲黄色片| 国产欧美激情视频| 亚洲熟妇国产熟妇肥婆| 三日本三级少妇三级99| 国产免费观看高清视频| 中文字幕av久久| 韩国日本美国免费毛片| av日韩在线看| jizz18女人| 日韩欧美xxxx| 欧美日韩二三区| 日本美女爱爱视频| 一区二区三区视频网| 欧美日韩亚洲一| 男女激情免费视频| japanese在线视频| 色哟哟精品视频| 女人另类性混交zo| av之家在线观看| 男人添女人下部高潮视频在观看 | 亚洲小说欧美另类激情| 亚洲天堂2018av| 日本中文字幕高清| 哪个网站能看毛片| 777久久久精品一区二区三区 | 亚洲免费999| 欧美成人三级在线播放| 无码人妻丰满熟妇区五十路百度| 欧美激情视频免费看| 超碰成人免费在线| 日本日本19xxxⅹhd乱影响| 免费人成在线观看视频播放| 白白操在线视频|