Dalam konteks pembangunan Go, anda mungkin menghadapi senario di mana anda perlu mendapatkan semula tandatangan fungsi secara pemprograman sebagai seutas tali. Memahami cara untuk mencapai ini adalah penting untuk melaksanakan introspeksi jenis lanjutan dan pengendalian ralat.
Pakej pantulan dalam Go menyediakan keupayaan pantulan yang meluas, termasuk keupayaan untuk mendapatkan pantulan fungsi.Type. Walau bagaimanapun, reflect.Type.String() hanya mengembalikan nama jenis yang mungkin tidak selalu memberikan maklumat yang mencukupi.
Untuk mendapatkan tandatangan fungsi penuh, kita mesti menyelidiki refleksi .Taip untuk mengekstrak parameter dan jenis hasil secara manual. Berikut ialah fungsi yang melakukan perkara ini:
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() }
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(""))
func (int) error func (int) error func () time.Time func (string) (*os.File, error) func (io.Writer, string, int) *log.Logger <not a function>
Adalah penting untuk ambil perhatian bahawa ini pendekatan tidak menangkap nama parameter atau jenis hasil. Ini kerana Go tidak menyimpan maklumat ini pada masa jalan.
Atas ialah kandungan terperinci Bagaimana Cara Mendapatkan Tandatangan Penuh Fungsi Go secara Pengaturcaraan sebagai Rentetan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!