Bagaimana Cara Mendapatkan Tandatangan Penuh Fungsi Go secara Pengaturcaraan sebagai Rentetan?

Mary-Kate Olsen
Lepaskan: 2024-11-19 18:05:03
asal
245 orang telah melayarinya

How to Programmatically Get a Go Function's Full Signature as a String?

Cara Mendapatkan Tandatangan Fungsi sebagai Rentetan dalam Go

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.

Latar Belakang

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.

Mendapatkan Tandatangan

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

Contoh Penggunaan

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

Batasan

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!

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