在Go中无法始终获取func签名的反射信息

axr492tv  于 5个月前  发布在  Go
关注(0)|答案(1)|浏览(43)

我有一个返回函数签名的字符串表示:

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)
}

字符串
然而,有些参数和返回类型返回空字符串,所以我放了“”,这并不理想。有没有什么方法可以检索输入和返回值的名称/类型?

aiazj4mn

aiazj4mn1#

Type.Name()方法返回类型的名称。并非所有类型都有名称。例如,类型[]byte没有名称。
使用Type.String()获取任何类型的字符串表示。

var params []string
for i := 0; i < funcType.NumIn(); i++ {
    params = append(params, funcType.In(i).String())
}

var returns []string
for i := 0; i < funcType.NumOut(); i++ {
    returns = append(returns, funcType.Out(i).String())
}

字符串
https://go.dev/play/p/4ypAlnQN-tX
您也可以在函数类型上调用String()String()方法返回的结果与问题中的代码不同,但它可能符合您的要求。

func getFuncSignature(v interface{}) string {
    return reflect.Typeof(v).String()
}


https://go.dev/play/p/8E4E76T9lfr

相关问题