Go语言如何通过reflect.New反射实例化对象并调用其方法
Go反射实例化对象并调用方法的问题解决
原代码错误点
- 类型获取逻辑错误:
reflect.TypeOf(&foo{})拿到的是*foo的指针类型,后续reflect.New(t)会生成**foo类型的实例,多了一层指针层级,导致方法匹配失败 - 方法调用对象不符合规则:
Bar方法的接收者是*foo类型,需要在对应*foo类型的有效反射值上调用方法,原代码取值逻辑不符合方法查找要求
正确实现代码
package main import ( "fmt" "reflect" ) type foo struct { name string } func (f *foo) Bar() { f.name = "baz" fmt.Println("hi " + f.name) } func main() { // 获取foo结构体的原始类型,先取*foo的类型再调用Elem得到foo结构体类型 t := reflect.TypeOf(&foo{}).Elem() // 反射创建*foo类型的实例,返回的反射值本身就是*foo类型,匹配Bar方法的指针接收者要求 fooInstance := reflect.New(t) // 查找并调用Bar方法,无参数时传入空的reflect.Value切片 fooInstance.MethodByName("Bar").Call([]reflect.Value{}) }
运行后输出:hi baz
额外注意事项
- 如果直接通过结构体获取类型,可写为
t := reflect.TypeOf(foo{}),不需要额外调用Elem() - 调用带参数的方法时,需要将所有参数转为
reflect.Value类型,按顺序放入Call的切片参数中 - 只有首字母大写的导出方法可以通过反射调用,小写非导出方法反射无法访问
- 如果方法有返回值,
Call方法会返回对应[]reflect.Value切片,可以按需解析返回值
内容的提问来源于stack exchange,提问作者Ynefota
相关产品推荐
相关产品推荐

