Go中通过反射调用函数需用reflect.Value.Call,参数和返回值均为[]reflect.Value切片,要求类型数量严格匹配,导出函数才可调用,方法需绑定接收者并注意指针/值接收者区别。
在 Go 中通过反射调用函数,核心是使用 reflect.Value.Call 方法。它要求传入的参数是 []reflect.Value 类型,返回值也是 []reflect.Value 切片。关键在于:参数必须与函数签名严格匹配(类型、数量),且需提前转为 reflect.Value;返回值需手动取值并转换回原始类型。
只有导出(首字母大写)的函数才能被反射调用。普通函数、方法(需绑定接收者)都支持,但注意函数本身不能是未命名的闭包或内联函数。
例如:
func Add(a, b int) int { return a + b }将实际参数逐个转为 reflect.Value,放入切片。类型必须与函数形参一致,否则 Call 会 panic。
reflect.ValueOf(x)
reflect.ValueOf(&y)
interface{})要传具体值,reflect.Va
lueOf(myVal) 即可示例:
f := reflect.ValueOf(Add)Call 总是返回 []reflect.Value,长度等于函数声明的返回值个数。每个元素需显式调用 .Interface() 或类型断言提取真实值。
results[0].Interface().(int)
ok := results[0].Bool(); err := results[1].Interface().(error)
results[i].Kind() 判断,再用对应方法(如 .Int()、.String())取值.Interface() panic,建议配合 .CanInterface() 检查方法需先绑定实例。用 reflect.ValueOf(instance).MethodByName("MethodName") 获取可调用的 reflect.Value,再按普通函数方式传参。
&obj)obj 或 &obj 均可(反射会自动解引用)示例:
type Calculator struct{}