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+v| 在线观看高清免费视频| 无码中文字幕色专区| 欧美日韩一级在线| 激情五月婷婷基地| 久久久国产精华液999999 | 国产二区视频在线播放| 日日摸日日碰夜夜爽无码| 成人性做爰片免费视频| 日本免费黄色小视频| 亚洲精品高清无码视频| 91免费国产精品| 六月婷婷激情网| 日韩a∨精品日韩在线观看| www.夜夜爱| 亚洲成人天堂网| 99热自拍偷拍| av在线com| 国产精品成人久久电影| 免费观看国产视频在线| 欧美性大战久久久久xxx| 日本a在线天堂| 亚洲一区二区三区av无码| 北条麻妃av高潮尖叫在线观看| 色综合五月婷婷| 免费无码av片在线观看| 久久婷婷综合色| 日本精品一区在线观看| 色一情一区二区三区| www.爱色av.com| 天天干天天操天天玩| 久久精品无码中文字幕| 日本中文字幕精品—区二区| 日韩av高清在线看片| 色七七在线观看| 91网站在线观看免费| 天天影视综合色| a级片一区二区| 亚洲 欧美 日韩 国产综合 在线| 日本黄色三级大片| 亚洲欧美久久久久| jizzjizzxxxx| 又粗又黑又大的吊av| 久久www视频| 亚洲36d大奶网| 青青青免费在线| 在线观看三级网站| 国产精品免费看久久久无码| 日本888xxxx| 欧美三级一级片| 日本网站免费在线观看| 在线视频一二三区| 最近免费观看高清韩国日本大全| 亚洲视频在线观看一区二区三区| 黄色大片中文字幕| 亚洲一区二区三区av无码| 欧洲精品在线播放| 亚洲色图都市激情| 日韩一级特黄毛片| 欧美亚洲日本一区二区三区 | caoporm在线视频| 国产免费中文字幕| 视频二区在线播放| 婷婷丁香激情网| 五月婷婷之婷婷| 亚洲欧美日韩精品一区| 日韩人妻精品一区二区三区| 久久国产精品国产精品| 日本77777| 国产精品成人久久电影| 欧美牲交a欧美牲交aⅴ免费真| 免费在线观看日韩视频| www成人免费| a级黄色一级片| 亚洲综合欧美激情| 国产尤物av一区二区三区| 黄色网在线视频| 男人搞女人网站| 天堂а√在线中文在线| 欧美黄色一级片视频| 红桃av在线播放| 国产精品无码免费专区午夜| wwwjizzjizzcom| 日韩精品一区二区免费| 乱人伦xxxx国语对白| 久久出品必属精品| 丝袜制服一区二区三区| 狠狠噜天天噜日日噜| 国产成人黄色网址| 18禁免费无码无遮挡不卡网站| www.五月天色| 丁香花在线影院观看在线播放 | 一本岛在线视频| 乱妇乱女熟妇熟女网站| 五月婷婷激情久久| av电影一区二区三区| 亚洲老女人av| 人妻无码视频一区二区三区| 欧洲在线免费视频| 午夜肉伦伦影院| 国产亚洲欧美在线视频| 久久久久久久久久久久久国产| www.av91| 97在线国产视频| 亚洲18在线看污www麻豆| 毛片av在线播放| 热久久精品免费视频| 全黄性性激高免费视频| 玖玖精品在线视频| 久久精品国产精品亚洲精品色| 亚洲一级片免费| 美女一区二区三区视频| 成人性免费视频| 国产成人一二三区| 免费视频爱爱太爽了| 中文字幕一区二区在线观看视频| 免费在线观看亚洲视频| 996这里只有精品| 欧美一级免费在线观看| 午夜剧场在线免费观看| 九九九在线观看视频| 无需播放器的av| 粉嫩虎白女毛片人体| 欧美三级午夜理伦三级| 福利视频一区二区三区四区| 国产在线视频综合| 女人床在线观看| 热这里只有精品| 欧美精品一区二区性色a+v| 日本大片免费看| 成人免费网站入口| 91av资源网| 中文字幕免费高清在线| www.黄色网址.com| www.日本在线播放| 欧美三级理论片| 欧美在线aaa| 依人在线免费视频| 亚洲第一页在线视频| 中文字幕超清在线免费观看| 国产老熟妇精品观看| 亚欧无线一线二线三线区别| 免费无码国产v片在线观看| 人妻有码中文字幕| 狠狠操狠狠干视频| 91成人在线观看喷潮教学| 人妻少妇被粗大爽9797pw| 牛夜精品久久久久久久| 亚洲色图欧美自拍| 日本熟妇人妻xxxx| 欧美精品色婷婷五月综合| jizz18女人| 免费欧美一级视频| 免费看污黄网站| 亚洲欧美日韩不卡| www.com黄色片| 日韩精品免费一区| 无尽裸体动漫2d在线观看| 亚洲色图都市激情| 六月丁香婷婷激情| 久久精品久久99| 欧美精品卡一卡二| 九九热在线免费| 日韩激情视频一区二区| 91在线视频观看免费| 欧美黄色免费网址| 中文字幕第36页| 国产黄色激情视频| 激情五月五月婷婷| 免费观看成人在线视频| 日韩精品手机在线观看| 手机看片福利盒子久久| 国产精品丝袜久久久久久消防器材| 亚洲色图 在线视频| 日韩亚洲欧美视频| 成年丰满熟妇午夜免费视频| 成年人免费在线播放| 免费日韩在线观看| 四虎成人在线播放| 天天av天天操| 日韩欧美色视频| 污版视频在线观看| 999这里有精品| 在线视频观看一区二区| 夫妻免费无码v看片| aa在线免费观看| 青青在线视频免费观看| 午夜福利123| 久久久久久久少妇| 亚洲va综合va国产va中文| www.cao超碰| 一区二区三区视频在线观看免费| 欧美 日韩 亚洲 一区| 激情六月天婷婷| av日韩在线看| 男人添女荫道口喷水视频| 亚洲小视频在线播放| 国产精品久久..4399| 日韩毛片在线免费看|