在 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中文网其他相关文章!