Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mendapatkan Tanda Tangan Fungsi Go sebagai Rentetan?

Bagaimana untuk Mendapatkan Tanda Tangan Fungsi Go sebagai Rentetan?

Linda Hamilton
Linda Hamiltonasal
2024-12-03 10:55:15843semak imbas

How to Retrieve a Go Function's Signature as a String?

Mengambil semula Tandatangan Fungsi sebagai Rentetan dalam Go

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!

Kenyataan:
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