首页 > 后端开发 > Golang > 如何获取 Go 函数的字符串签名?

如何获取 Go 函数的字符串签名?

DDD
发布: 2024-11-19 19:14:02
原创
815 人浏览过

How to Get a Go Function's Signature as a String?

如何在 Go 中以字符串形式获取函数签名

您的查询涉及签名的检索,签名是函数签名的字符串表示形式类型,给定一个函数变量。

理解reflect.Type.String()

reflect.Type.String() 方法返回类型的名称,而不是完整的签名。当函数值是函数文字(未命名类型)时,它会打印签名。

手动构造签名

要检索命名类型的签名,信息需要来自reflect.Type。这是构造签名的函数:

func signature(f interface{}) string {
    t := reflect.TypeOf(f)
    if t.Kind() != reflect.Func {
        return "<not a function>"
    }

    buf := strings.Builder{}
    buf.WriteString("func (")
    for i := 0; i < t.NumIn(); i++ {
        if i > 0 {
            buf.WriteString(", ")
        }
        buf.WriteString(t.In(i).String())
    }
    buf.WriteString(")")
    if numOut := t.NumOut(); numOut > 0 {
        if numOut > 1 {
            buf.WriteString(" (")
        } else {
            buf.WriteString(" ")
        }
        for i := 0; i < t.NumOut(); i++ {
            if i > 0 {
                buf.WriteString(", ")
            }
            buf.WriteString(t.Out(i).String())
        }
        if numOut > 1 {
            buf.WriteString(")")
        }
    }

    return buf.String()
}
登录后复制

测试函数

签名函数的示例输出:

fmt.Println(signature(func(i int) error { return nil }))
fmt.Println(signature(myFunc))
fmt.Println(signature(time.Now))
fmt.Println(signature(os.Open))
fmt.Println(signature(log.New))
fmt.Println(signature(""))
登录后复制

预期输出:

func (int) error
func (int) error
func () time.Time
func (string) (*os.File, error)
func (io.Writer, string, int) *log.Logger
<not a function>
登录后复制

注意:由于缺乏可访问的信息,无法打印参数和结果类型名称。

以上是如何获取 Go 函数的字符串签名?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板