如何在Go 中以字串形式取得函數簽章
您的查詢涉及簽章的檢索,簽章是函式簽章的字串表示形式類型,給定一個函數變數。
理解reflect.Type.String()
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() }
測試函數
簽章函數的範例輸出:
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 函數的字串簽章?的詳細內容。更多資訊請關注PHP中文網其他相關文章!