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

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

go generate命令的作用是什么

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

go generate命令的作用是什么

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

Go語言提供了一系列強大的工具,靈活使用這些工具,能夠讓我們的項目開發(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ù)源代碼生成代碼。當運行g(shù)o generate時,它將掃描與當前包相關(guān)的源代碼文件,找出所有包含"// 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"//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的簡單介紹,可能讀者并沒有感受到該工具的強大之處,小菜刀提供一個該工具的經(jī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)
登錄后復制

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

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

上面的命令,代表運行stringer工具來為Pill類型生成String方法,默認輸出到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類型有修改時,我們所需要做的就是運行以下語句即可。

$ go generate
登錄后復制

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

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

go generate命令的作用是什么

總結(jié)


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

go generate命令的作用是什么

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

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
国产毛片精品久久| 美腿丝袜亚洲一区| 欧美成a人片免费观看久久五月天| 怡红院精品视频在线观看极品| 成人在线超碰| 国产精品115| 欧美午夜三级| 亚洲精品欧洲| 综合激情婷婷| 欧美综合另类| 麻豆一区二区三区| 美国欧美日韩国产在线播放| 欧美特黄视频| 欧美日韩国产高清电影| 国产麻豆一区二区三区 | 免费在线成人| 国产亚洲欧美日韩精品一区二区三区| 欧美久久精品一级c片| 在线观看精品| 久久久久欧美精品| 丝袜美腿诱惑一区二区三区| av日韩中文| 中文在线а√在线8| 中文字幕日本一区| 男女男精品视频网| 影音先锋久久精品| 一区二区电影| 日韩中文字幕一区二区高清99| 亚洲字幕久久| 免费观看在线综合| 九九综合九九| 日韩精品欧美| 日本aⅴ精品一区二区三区| 亚洲精品少妇| 久久久夜夜夜| 亚洲天堂久久| 亚洲一区国产| 日本一区二区三区视频在线看 | 久久久国产精品入口麻豆| 美女视频黄 久久| 人在线成免费视频| 在线人成日本视频| 亚洲91视频| 老牛国产精品一区的观看方式| 中文字幕一区二区三区四区久久| 日韩高清中文字幕一区| 日本一区二区三区中文字幕| 青青草国产精品亚洲专区无| 国产探花一区在线观看| 麻豆极品一区二区三区| 亚洲风情在线资源| 久久精品国产久精国产| 国产一区二区三区四区| 欧美三级网址| 91久久黄色| 婷婷精品久久久久久久久久不卡| 国产精品一区毛片| 日韩一区欧美| 亚洲色诱最新| 国产精品网址| 日本不卡免费高清视频在线| 国产亚洲精品v| 日本视频一区二区| 国内一区二区三区| 日本久久成人网| 亚洲最大av| 久久亚洲道色| 激情欧美国产欧美| 日韩国产欧美视频| 日韩中文在线电影| 国产精品普通话对白| 国产麻豆一区| 99久久精品费精品国产| 亚洲精品一二| 中文字幕成在线观看| 爽好久久久欧美精品| 青青草91视频| 亚洲韩日在线| 国产乱人伦精品一区| 亚洲精品va| 久久免费视频66| 欧美另类综合| 精品成av人一区二区三区| 美女日韩在线中文字幕| 久久精品国产网站| 亚洲欧美网站| 欧美亚洲日本精品| 日韩久久99| 欧美日韩一区二区综合| 国产日产一区| 尤物在线精品| 成人亚洲一区| 日韩不卡手机在线v区| 久久免费国产| 国产精品调教| 在线免费观看亚洲| 中文在线资源| 日韩欧美在线精品| 成年男女免费视频网站不卡| 日韩1区2区3区| 欧美精品激情| 日韩欧美看国产| 国产精品香蕉| 亚洲精品四区| 国产精品毛片| 亚洲欧洲午夜| 女主播福利一区| 九九久久婷婷| 在线一区电影| 麻豆精品网站| 亚洲制服一区| 日韩国产91| 免费在线看一区| 在线国产精品一区| 亚洲精品中文字幕99999| 综合干狼人综合首页| 亚洲在线久久| 91福利精品在线观看| 国产精品亚洲欧美| 免费在线亚洲欧美| 风间由美中文字幕在线看视频国产欧美| 麻豆精品一区二区综合av| 欧美激情三区| 电影91久久久| 日韩免费福利视频| 久久国产亚洲| 免费av一区二区三区四区| 精品中文字幕一区二区三区av| 午夜免费一区| 蜜臀精品一区二区三区在线观看| 亚洲精品动态| 欧美日一区二区三区在线观看国产免| 欧美在线首页| 欧美精品成人| 岛国av免费在线观看| 91精品国产自产在线观看永久∴| 成人久久一区| 午夜在线播放视频欧美| 亚洲欧洲美洲国产香蕉| 国产亚洲电影| 精品国产乱码久久久久久1区2匹| 久久久久久久欧美精品| 美女av一区| 日韩电影免费在线观看| 国产一区清纯| 亚洲另类视频| 国产精品亚洲片在线播放| 麻豆精品在线播放| 色偷偷偷在线视频播放| 激情综合网五月| 免费视频一区二区| 国产精品日韩精品中文字幕| 国产欧洲在线| 亚洲综合不卡| 国产精品一页| 久久免费大视频| 亚洲日本久久| 九九九精品视频| 欧美va亚洲va日韩∨a综合色| 亚洲无线观看| 久久影院资源站| 国精品一区二区| 亚洲精品裸体| 麻豆国产在线| 伊人久久亚洲| 国产一区二区精品福利地址| 女人天堂亚洲aⅴ在线观看| 91精品国产一区二区在线观看| 国产91在线播放精品| 夜夜嗨一区二区三区| 国产精品一区二区精品| 青青久久av| 婷婷精品在线| 日韩激情一区| 蜜桃视频免费观看一区| 国产免费播放一区二区| 91精品啪在线观看国产18| 巨乳诱惑日韩免费av| 久久亚州av| 视频一区视频二区在线观看| 韩日一区二区| 亚洲人成高清| 97se综合| 久久国产精品免费一区二区三区| 香蕉成人av| 奇米狠狠一区二区三区| 在线一区视频观看| 国产精品一区二区三区av麻| 激情偷拍久久| 久久wwww| 鲁大师成人一区二区三区| 国产一区二区三区不卡视频网站| 午夜精品一区二区三区国产| 国产精品一区二区精品视频观看 | 国语精品一区| 亚洲精品影院在线观看| 日本久久成人网| 欧美精品成人| 香蕉久久久久久| 国产中文一区|