在Go 開發的上下文中,您可能會遇到需要以程式設計方式擷取函數簽章的場景,如下所示一個字串。了解如何實現這一點對於執行高級類型自省和錯誤處理至關重要。
Go 中的 Reflect 套件提供了廣泛的反射功能,包括獲取函數的 Reflect.Type 的能力。然而,reflect.Type.String() 只傳回類型名稱,可能不會總是提供足夠的資訊。
要取得完整的函數簽名,我們必須深入研究reflect .Type 手動擷取參數和結果類型。這是執行此操作的函數:
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>
需要注意的是,此函數方法不捕獲參數名稱或結果類型。這是因為 Go 不會在運行時儲存這些資訊。
以上是如何以程式設計方式取得 Go 函數的完整簽名作為字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!