在 Go 开发的上下文中,您可能会遇到需要以编程方式检索函数签名的场景,如下所示一个字符串。了解如何实现这一点对于执行高级类型自省和错误处理至关重要。
Go 中的 Reflect 包提供了广泛的反射功能,包括获取函数的 Reflect.Type 的能力。然而,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() }
var myFunc ModuleInitFunc 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 不会在运行时存储这些信息。
以上是如何以编程方式获取 Go 函数的完整签名作为字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!