本文介绍使用 `reflect` 包判断任意变量是否为函数类型的方法,提供简洁可靠的 `isfunc` 工具函数,并说明其原理、使用限制及实际注意事项。
在 Go 中,由于类型系统是静态且无运行时类型谓词(如 Python 的 callable()),要判断一个接口值(any)是否底层为函数类型,必须借助反射机制。核心思路是:通过 reflect.TypeOf(v) 获取其 reflect.Type,再调用 .Kind() 方法获取基础类型类别(如 reflect.Func、reflect.Struct 等),并与 reflect.Func 进行比较。
以下是一个通用、安全的实现:
import "reflect"
func IsFunc(v any) bool {
return reflect.TypeOf(v).Kind() == reflect.Func
}✅ 使用示例:
func A() {}
func B(x int) string { return "ok" }
func main() {
println(IsFunc(A)) // true
println(IsFunc(B)) // true
println(IsFunc(func() {})) // true
println(IsFunc(42)) // false
println(IsFunc("hello")) // false
println(IsFunc(nil)) // panic: reflect.TypeOf(nil) returns nil!
}⚠️ 重要注意事项:
func IsFunc(v any) bool {
t := reflect.TypeOf(v)
if t == nil {
return false
}
return t.Kind() == reflect.Func
}总结:reflect.Func 是识别函数
类型的权威依据;配合空值防护,IsFunc 可作为标准工具函数集成进项目 utils 包,安全、简洁、符合 Go 惯例。