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

问题描述 投票:0回答:1

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

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

但是,某些参数和返回类型返回空字符串,因此我输入了“”,这并不是很理想。有没有办法检索输入和返回值的名称/类型?

go reflection
1个回答
1
投票

Type.Name() 方法仅返回命名类型的非空字符串。

使用 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

© www.soinside.com 2019 - 2024. All rights reserved.