在Go 中以字串形式檢索函數的簽章
在Go 中,確定具有特定名稱和簽署的函數的簽名main包對於在出現差異時提供資訊性錯誤訊息至關重要。
可以Reflect.Type.String() 擷取簽名?
雖然reflect.Type.String() 提供類型的名稱(如main.ModuleInitFunc),但它無法提供完整的簽章。這在處理具有命名類型的函數值時尤其明顯。
建構簽名
要建構簽名,我們必須手動從reflect.Type收集資訊.
範例實作
下面是一個產生函數簽章的範例函數value:
func signature(f interface{}) string { t := reflect.TypeOf(f) if t.Kind() != reflect.Func { return "<not a function>" } ... return buf.String() }
此函數透過迭代輸入和輸出類型並將它們組裝成人類可讀的字串來建構簽名。
測試簽名函數
測試簽名函數會產生以下結果results:
fmt.Println(signature(func(i int) error { return nil })) // func (int) error fmt.Println(signature(myFunc)) // func (int) error fmt.Println(signature(time.Now)) // func () time.Time fmt.Println(signature(os.Open)) // func (string) (*os.File, error) fmt.Println(signature(log.New)) // func (io.Writer, string, int) *log.Logger fmt.Println(signature("")) // <not a function>
需要注意的是,Go 不提供對參數和結果類型名稱的訪問,因此它們在簽名中被省略。
以上是如何以字串形式檢索 Go 函數的簽章?的詳細內容。更多資訊請關注PHP中文網其他相關文章!