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
Lepaskan: 2024-12-03 10:55:15
asal
854 orang telah melayarinya

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

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

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

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!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan