首頁  >  文章  >  後端開發  >  如何以字串形式檢索 Go 函數的簽章?

如何以字串形式檢索 Go 函數的簽章?

Patricia Arquette
Patricia Arquette原創
2024-11-23 00:12:34979瀏覽

How Can I Retrieve a Go Function's Signature as a String?

在Go 中以字串形式檢索函數的簽章

在Go 中,確定具有特定名稱和簽署的函數的簽名main包對於在出現差異時提供資訊性錯誤訊息至關重要。

可以Reflect.Type.String() 擷取簽名?

雖然reflect.Type.String() 提供類型的名稱(如main.ModuleInitFunc),但它無法提供完整的簽章。這在處理具有命名類型的函數值時尤其明顯。

建構簽名

要建構簽名,我們必須手動從reflect.Type收集資訊.

  • Type.In() 提供第ith 的型別參數。
  • Type.Out() 提供第 ith 個結果類型的型別。

範例實作

下面是一個產生函數簽章的範例函數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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn