我有一个返回函数签名的字符串表示:
func getFuncSignature(v interface{}) string {
funcValue := reflect.ValueOf(v)
funcType := funcValue.Type()
name := funcType.Name()
// Function signature
var params []string
for i := 0; i < funcType.NumIn(); i++ {
nm := funcType.In(i).Name()
if strings.TrimSpace(nm) == "" {
nm = "<unk>" // <<<<<<<<<<<<<<<<<<<<< HERE 1
}
params = append(params, nm)
}
var returns []string
for i := 0; i < funcType.NumOut(); i++ {
nm := funcType.Out(i).Name()
if strings.TrimSpace(nm) == "" {
nm = "<unk>" // <<<<<<<<<<<<<<<<<<<<<< HERE 2
}
returns = append(returns, nm)
}
paramsStr := strings.Join(params, ", ")
returnsStr := strings.Join(returns, ", ")
if name != "" {
return fmt.Sprintf("(func %s(%s) => (%s))", name, paramsStr, returnsStr)
}
return fmt.Sprintf("(func(%s) => (%s))", paramsStr, returnsStr)
}
字符串
然而,有些参数和返回类型返回空字符串,所以我放了“”,这并不理想。有没有什么方法可以检索输入和返回值的名称/类型?
1条答案
按热度按时间aiazj4mn1#
Type.Name()方法返回类型的名称。并非所有类型都有名称。例如,类型
[]byte
没有名称。使用Type.String()获取任何类型的字符串表示。
字符串
https://go.dev/play/p/4ypAlnQN-tX
您也可以在函数类型上调用
String()
。String()
方法返回的结果与问题中的代码不同,但它可能符合您的要求。型
https://go.dev/play/p/8E4E76T9lfr的