Arahan "go generate" digunakan untuk menjana jenis kod tertentu secara automatik sebelum penyusunan kod; ia sering digunakan untuk menjana kod secara automatik, dan ia boleh menjana kod berdasarkan kod sumber sebelum kod disusun. Apabila arahan "go generate" dijalankan, ia akan mengimbas fail kod sumber yang berkaitan dengan pakej semasa, mencari semua komen khas yang mengandungi "//go:generate", mengekstrak dan melaksanakan arahan berikutan ulasan khas.
Persekitaran pengendalian tutorial ini: sistem Windows 7, GO versi 1.18, komputer Dell G3.
Bahasa Go menyediakan satu siri alatan yang berkuasa Penggunaan alat ini yang fleksibel boleh memudahkan pembangunan projek kami.
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
Kod sumber alat terletak di $GOPATH/src/cmd/internal Artikel ini membincangkan jana alat Go.
Arahan go generate ialah arahan yang baru ditambah dalam bahasa Go versi 1.4, yang biasa digunakan untuk automasi Jana kod, yang menjana kod daripada kod sumber sebelum kod disusun. Apabila menjalankan go generate, ia akan mengimbas fail kod sumber yang berkaitan dengan pakej semasa, mencari semua pernyataan ulasan yang mengandungi "// go:generate", ekstrak dan laksanakan arahan selepas ulasan, dan arahan itu akan menjadi program boleh laku. Proses ini serupa dengan memanggil dan melaksanakan skrip shell.
//go:generate command argument...
$ go generate [-run regexp] [-n] [-v] [-x] [build flags] [file.go... | packages]
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!")}
Laksanakan arahan go generate
$ go generate GoGoGo!go rum main.go!amd64 darwin main.go 7 main
Selepas membaca pengenalan ringkas jana di atas, pembaca mungkin tidak merasakan kuasa alat ini menyediakan senario aplikasi klasik alat ini: melaksanakan kaedah String untuk pemalar penghitungan.
Satu lagi rentetan alat rasmi perlu disebut di sini, yang boleh menulis kaedah String() secara automatik untuk set pemalar integer. Memandangkan stringer tiada dalam set alat keluaran Go rasmi, kami perlu memasangnya sendiri dan melaksanakan arahan berikut.
go get golang.org/x/tools/cmd/stringer
Berikut ialah contoh yang dipetik daripada dokumentasi stringer. Kodnya adalah seperti berikut, yang mentakrifkan satu set pemalar integer jenis Pil yang berbeza.
package painkillertype Pill intconst ( Placebo Pill = iota Aspirin Ibuprofen Paracetamol Acetaminophen = Paracetamol)
Untuk penyahpepijatan atau sebab lain, kami mahu pemalar ini dicetak, yang bermaksud Pil mesti mempunyai kaedah yang ditandatangani.
func (p Pill) String() string
Untuk mencapainya, ia sangat mudah.
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)}
Bayangkan jika sekumpulan nama ubat baharu ditambahkan pada senarai Pil kami Setiap kali nama ubat ditambah atau diubah suai, fungsi tandatangan yang sepadan juga perlu ditukar. Bukankah ini menyusahkan dan mungkin terlepas atau salah? Pada masa ini, kita boleh menyelesaikan masalah ini melalui go generate + stringer. Ia sangat mudah, cuma tambahkan pernyataan komen pada kod yang mentakrifkan Pil.
//go:generate stringer -type=Pill
Arahan di atas bermaksud menjalankan alat rentetan untuk menjana kaedah Rentetan untuk jenis Pil Secara lalai, ia dikeluarkan ke fail 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 = Pill(len(_Pill_index)) { return fmt.Sprintf("Pill(%d)", i) } return _Pill_name[_Pill_index[i]:_Pill_index[i+1]]}
Dengan cara ini, setiap kali kami mengubah suai jenis Pil, apa yang perlu kami lakukan ialah menjalankan pernyataan berikut.
$ go generate
Sudah tentu, jika anda mendapati perkara ini menyusahkan, atau bimbang terlupa untuk melaksanakan kenyataan jana. Kemudian, anda boleh menulis pernyataan go generate ke dalam Makefile dan letakkannya sebelum arahan go build untuk mengautomasikan penjanaan dan penyusunan kod.
Perlu dinyatakan bahawa dalam dokumen kod sumber Go, penyelesaian go generate+stringer digunakan secara meluas untuk melaksanakan kaedah String untuk pemalar penghitungan. Di bawah kod sumber Go 1.14.1 asli Xiaocai Knife, terdapat sejumlah 23 kegunaan, seperti berikut.
Artikel ini terutamanya memperkenalkan apa itu jana, apa yang boleh dilakukannya, jika anda ingin Untuk memahami logik pelaksanaan dalamannya secara mendalam, anda boleh melihat proses terperinci penjanaan kod dalam kod sumber Go, seperti penjanaan zfuncversion.go melalui genzfunc.go di bawah pakej isihan. Dalam rumah harta kod sumber Go, anda boleh menemui banyak logik pelaksanaan yang serupa, sila rujuk perkara berikut.
Mereka menggunakan perpustakaan yang disediakan oleh pengkompil Go, termasuk go/ast untuk mentakrifkan pokok sintaks abstrak, go/parser untuk menghuraikan pokok sintaks abstrak, go/format untuk menghurai pemformatan kod dan go/ untuk penanda leksikal Go. token, dsb. Menghuraikan fail sumber dan menjana kod baharu mengikut templat sedia ada Proses ini serupa dengan menggunakan templat untuk menjana fail HTML dalam perkhidmatan Web.
[Cadangan berkaitan: Pergi tutorial video, Pengajaran pengaturcaraan]
Atas ialah kandungan terperinci Apakah fungsi arahan go generate?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!