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