gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费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
登錄后復(fù)制

工具的源碼位于$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...
登錄后復(fù)制

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

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

注意事項

  • 該特殊注釋必須包含在.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!")}
登錄后復(fù)制

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

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

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


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

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

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

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

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

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

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

要實現(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)}
登錄后復(fù)制

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

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

上面的命令,代表運行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]]}
登錄后復(fù)制

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

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

當然,你要是覺得這樣麻煩,或者擔心忘記執(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 服務(wù)中利用模板生成 HTML 文件類似。

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
国产日韩亚洲欧美在线| 日韩欧美一区三区| 蜜臀在线免费观看| 亚洲欧美日韩三级| 免费看啪啪网站| 中文字幕在线视频一区二区三区| 黄色一级视频片| 免费日韩中文字幕| 国内av一区二区| 毛片在线播放视频| 69堂免费视频| 免费看涩涩视频| 亚洲美免无码中文字幕在线| 日本中文字幕精品—区二区| 欧洲精品在线播放| 激情视频免费网站| 成人在线免费观看av| 88av.com| 青青在线视频观看| 性一交一乱一伧国产女士spa| 中文字幕亚洲影院| 色91精品久久久久久久久| 福利在线小视频| 小早川怜子一区二区三区| 播放灌醉水嫩大学生国内精品| 色爽爽爽爽爽爽爽爽| 亚洲不卡视频在线| 在线看的黄色网址| 男女污污视频网站| 欧美xxxxxbbbbb| 日日噜噜夜夜狠狠| 男人揉女人奶房视频60分 | www.激情网| 国产人妻人伦精品| 青青青在线观看视频| 91香蕉视频免费看| 男插女免费视频| 国产精品333| 国产高清精品软男同| 女性隐私黄www网站视频| 欧美,日韩,国产在线| 久久久久久久久久福利| 无套内谢丰满少妇中文字幕| 成人国产在线看| 色乱码一区二区三区在线| 手机在线视频你懂的| 国产肉体ⅹxxx137大胆| 91黄色小网站| 国产成a人亚洲精v品在线观看| 日日碰狠狠躁久久躁婷婷| 一级全黄肉体裸体全过程| 久久久久久久久久久免费视频| 欧美在线aaa| 99精品在线免费视频| 中文字幕永久有效| 国产一二三区在线播放| 日韩 欧美 自拍| www.超碰97.com| 美女网站色免费| 中文字幕成人在线视频| 国产精品亚洲a| 久久婷婷五月综合色国产香蕉| 欧美大黑帍在线播放| www.夜夜爱| av免费看网址| 日本999视频| 天堂av免费看| 欧美日韩二三区| 美女日批免费视频| 在线视频一二三区| 一级一片免费播放| 青青草精品视频在线| 成人性生生活性生交12| 欧美精品无码一区二区三区| 激情综合网婷婷| 欧美日韩第二页| 狠狠热免费视频| 强开小嫩苞一区二区三区网站| 加勒比av中文字幕| 成人在线视频一区二区三区 | 丰满少妇大力进入| 久久99久久99精品| 国产自产在线视频| 国产精品亚洲αv天堂无码| 99sesese| 播放灌醉水嫩大学生国内精品| 午夜免费福利视频在线观看| 日本福利视频网站| 日本黄大片一区二区三区| 99久久99精品| 欧美三级一级片| 免费看国产曰批40分钟| 久草视频国产在线| 免费网站永久免费观看| 成人免费视频91| 免费看欧美黑人毛片| 色婷婷综合网站| 情侣黄网站免费看| 亚洲一级片免费| 日韩成人av免费| 国产精品久久久久久久av福利| 在线免费看v片| 国产成年人在线观看| 2022中文字幕| 91国视频在线| 天堂中文av在线| 黄网站色视频免费观看| 99精品在线免费视频| 无码少妇一区二区三区芒果| 午夜天堂在线视频| 国产精品国产三级国产专区51| 亚洲污视频在线观看| 欧美性猛交xxxx乱大交91| 亚洲精品永久视频| 黄色av网址在线播放| www日韩视频| 男女av免费观看| 国产高清999| 国产又黄又大又粗视频| 五月激情五月婷婷| 999一区二区三区| 九九热在线免费| 日本福利视频在线| 久久久99精品视频| 久久婷婷国产91天堂综合精品| 五月天丁香花婷婷| 成人免费观看毛片| 精品少妇一区二区三区在线| 久久国产精品免费观看| 国产二级片在线观看| 亚洲av毛片在线观看| 天堂在线资源视频| 国产又黄又猛又粗| 9久久婷婷国产综合精品性色 | 国产尤物av一区二区三区| 日本美女高潮视频| 亚洲理论电影在线观看| 亚洲av综合色区| 两根大肉大捧一进一出好爽视频| 偷拍盗摄高潮叫床对白清晰| 手机av在线网站| 国内少妇毛片视频| 男生操女生视频在线观看| 日韩黄色短视频| 国产在线视频综合| 日韩精品视频在线观看视频| 激情网站五月天| 亚洲18在线看污www麻豆 | 色一情一区二区| 欧美h视频在线观看| 免费在线激情视频| 又色又爽又高潮免费视频国产| 久草热视频在线观看| 三日本三级少妇三级99| 韩国一区二区av| 日本在线视频www色| 色综合色综合色综合色综合| 欧美 另类 交| 美国av在线播放| 在线免费观看av的网站| 天天操天天爱天天爽| 爆乳熟妇一区二区三区霸乳| 女人床在线观看| 中国丰满人妻videoshd| 国产性生活免费视频| 激情久久综合网| 奇米视频7777| 五月天男人天堂| 一本色道久久88亚洲精品综合 | 久久精品在线免费视频| 国产一级做a爰片久久毛片男| 中文字幕精品一区二区三区在线| 黄色网页免费在线观看| 欧美 国产 综合| 最新黄色av网站| 九九九九免费视频| 国产情侣av自拍| 久久久久久久久久伊人| 喜爱夜蒲2在线| 97视频在线免费播放| 艹b视频在线观看| www.av片| 99热成人精品热久久66| 男人天堂成人在线| 国产免费又粗又猛又爽| 国产高清av在线播放| 免费看污黄网站| 国产资源在线视频| 精品久久久无码人妻字幂| 日本a在线免费观看| 国产在线视频三区| 91av在线免费播放| 国产无套内射久久久国产| 国产一二三四五| 中日韩av在线播放| 最新免费av网址| 九九视频精品在线观看| 午夜免费福利小电影| 黄瓜视频免费观看在线观看www| 一路向西2在线观看|