理解 Go 中的反射:检索函数名称
在 Go 的反射系统中,检索函数名称并不那么简单似乎。在某些情况下,预期的行为是在调用 Name 方法时获取空字符串。
意外的空字符串:
当使用以下代码片段时,Name方法返回一个空字符串:
package main import "fmt" import "reflect" func main() { typ := reflect.TypeOf(main) name := typ.Name() fmt.Println("Name of function: " + name) }
在此示例中,我们尝试使用反射检索主函数的名称。然而,输出显示为“Name of function:”,表示空名称。
使用runtime.FuncForPC的解决方案:
解决此问题的关键在于利用runtime.FuncForPC 函数。该函数返回一个指向 Func 类型的指针,该指针提供了有关该函数的附加信息,包括其名称。
package main import "fmt" import "reflect" import "runtime" func main() { name := runtime.FuncForPC(reflect.ValueOf(main).Pointer()).Name() fmt.Println("Name of function: " + name) }
现在,结果将是“main.main”,它准确地反映了函数的名称功能。如果您只想提取函数名称而不提取包名称,可以使用 strings.SplitN 函数拆分字符串。
以上是如何使用Go反射获取函数名称?的详细内容。更多信息请关注PHP中文网其他相关文章!