Menyenaraikan Kaedah Awam Pakej dalam Go
Soalan:
Bagaimana mungkin untuk menyenaraikan kaedah awam pakej dalam Go? Pertimbangkan struktur kod berikut:
main.go:
package main func main() { // list public methods in here }
libs/method.go:
package libs func Result1() { fmt.Println("method Result1") } func Result2() { fmt.Println("method Result2") }
Jawapan:
Malangnya, Go kekurangan ciri langsung untuk permintaan ini. Apabila pakej diimport, pengkompil boleh mengalih keluar kaedah yang tidak digunakan semasa pengoptimuman. Oleh itu, pengimportan pakej semata-mata tidak menjamin kehadiran semua kaedah.
Alternatif:
Analisis Statik:
Anda boleh menghuraikan kod sumber pakej dan mengekstrak pengisytiharan fungsi menggunakan perpustakaan pantulan Go. Pertimbangkan contoh berikut:
import ( "fmt" "go/parser" "go/token" ) func main() { fileset := token.NewFileSet() packages, err := parser.ParseDir(fileset, "./libs", nil, 0) if err != nil { fmt.Println("Parsing failed:", err) return } methods := []string{} for _, p := range packages { // Get all methods in each source file. for _, f := range p.Files { for _, dec := range f.Decls { if fn, ok := dec.(*parser.FuncDecl); ok && fn.Name.IsExported() { methods = append(methods, fn.Name.String()) } } } } fmt.Println("Exported methods in package 'libs':", methods) }
Nota: Pendekatan ini hanya menyediakan pengisytiharan fungsi, bukan pelaksanaannya.
Refleksi Dinamik:
Sebagai alternatif, anda boleh menggunakan pakej mencerminkan Go pada masa jalan untuk memeriksa kaedah sesuatu nilai. Walau bagaimanapun, ini memerlukan contoh yang dimulakan bagi jenis yang dimaksudkan.
Ingat bahawa pendekatan ini mempunyai had dan mungkin tidak sesuai untuk semua kes penggunaan.
Atas ialah kandungan terperinci Bagaimana untuk Menyenaraikan Kaedah Awam Pakej Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!