Masalah:
Dalam modul Go yang direka untuk memuatkan pemalam, adalah penting untuk memastikan bahawa fungsi tertentu dengan nama dan tandatangan yang telah ditetapkan wujud dalam pakej utama. Jika fungsi ini tiada atau tidak sepadan dengan tandatangan yang dijangkakan, mesej ralat deskriptif diperlukan. Memandangkan pembolehubah jenis fungsi, bagaimanakah tandatangan asas boleh diperolehi?
Penyelesaian:
Hanya bergantung pada reflect.Type.String() hanya memberikan nama jenis, seperti utama.ModuleInitFunc. Untuk mendapatkan semula tandatangan lengkap, kami mesti membinanya secara manual menggunakan maklumat yang disediakan oleh reflect.Type.
Pelaksanaan:
func signature(f interface{}) string { t := reflect.TypeOf(f) if t.Kind() != reflect.Func { return "<not a function>" } buf := strings.Builder{} buf.WriteString("func (") for i := 0; i < t.NumIn(); i++ { if i > 0 { buf.WriteString(", ") } buf.WriteString(t.In(i).String()) } buf.WriteString(")") if numOut := t.NumOut(); numOut > 0 { if numOut > 1 { buf.WriteString(" (") } else { buf.WriteString(" ") } for i := 0; i < t.NumOut(); i++ { if i > 0 { buf.WriteString(", ") } buf.WriteString(t.Out(i).String()) } if numOut > 1 { buf.WriteString(")") } } return buf.String() }
Penggunaan:
Dengan menghantar pembolehubah fungsi ke fungsi signature(), kita boleh mendapatkan tandatangan yang sepadan sebagai seutas tali. Contohnya:
var myFunc ModuleInitFunc fmt.Println(signature(func(i int) error { return nil })) fmt.Println(signature(myFunc)) fmt.Println(signature(time.Now)) fmt.Println(signature(os.Open)) fmt.Println(signature(log.New)) fmt.Println(signature(""))
Output:
func (int) error func (int) error func () time.Time func (string) (*os.File, error) func (io.Writer, string, int) *log.Logger <not a function>
Nota:
Adalah penting untuk menyedari bahawa ia adalah mustahil untuk mengekstrak nama parameter dan jenis hasil daripada tandatangan kerana Go tidak menyimpan atau menyediakan akses kepada itu maklumat.
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Tanda Tangan Fungsi Go sebagai Rentetan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!