Rumah > pembangunan bahagian belakang > Golang > Apakah fungsi arahan go generate?

Apakah fungsi arahan go generate?

青灯夜游
Lepaskan: 2023-01-30 15:07:17
asal
1191 orang telah melayarinya

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.

Apakah fungsi arahan go generate?

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
Salin selepas log masuk

Kod sumber alat terletak di $GOPATH/src/cmd/internal Artikel ini membincangkan jana alat Go.

alat automasi bahasa 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.

Cara menggunakan

  • Tambah ulasan istimewa
//go:generate command argument...
Salin selepas log masuk
  • Laksanakan arahan jana
$ go generate [-run regexp] [-n] [-v] [-x] [build flags] [file.go... | packages]
Salin selepas log masuk

Nota

  • Ulasan istimewa ini mesti disertakan dalam fail kod sumber .go.
  • Setiap fail kod sumber boleh mengandungi berbilang menjana komen khas.
  • go generate tidak akan dicetuskan oleh arahan seperti go build, go get, go test, dll., dan mesti digunakan secara eksplisit oleh pembangun.
  • Pelaksanaan arahan adalah bersiri Jika ralat berlaku, arahan berikutnya tidak akan dilaksanakan.
  • Ulasan khas mesti bermula dengan "//go:generate", tanpa ruang selepas garis miring berganda.
  • Arahan pelaksanaan mestilah program boleh laku di bawah PATH sistem (echo $PATH).

Contoh penggunaan

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!")}
Salin selepas log masuk

Laksanakan arahan go generate

$ go generate
GoGoGo!go rum main.go!amd64 darwin main.go 7 main
Salin selepas log masuk

Laksanakan kaedah Rentetan untuk pemalar penghitungan


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
Salin selepas log masuk

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)
Salin selepas log masuk

Untuk penyahpepijatan atau sebab lain, kami mahu pemalar ini dicetak, yang bermaksud Pil mesti mempunyai kaedah yang ditandatangani.

func (p Pill) String() string
Salin selepas log masuk

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)}
Salin selepas log masuk

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
Salin selepas log masuk

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]]}
Salin selepas log masuk

Dengan cara ini, setiap kali kami mengubah suai jenis Pil, apa yang perlu kami lakukan ialah menjalankan pernyataan berikut.

$ go generate
Salin selepas log masuk

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.

Apakah fungsi arahan go generate?

Ringkasan


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.

Apakah fungsi arahan go generate?

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!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan