问题:
是否可以动态创建一个实现预定义接口的函数去使用反射?
答案:
在 Go 的原始版本中,不可能通过反射创建带有附加方法的新类型。然而,随着 Go 1.5 的发布,引入了reflect.FuncOf 和reflect.MakeFunc 函数来满足这一确切需求。
这些函数允许您定义函数类型并创建遵循该类型的函数值type:
funcType := reflect.FuncOf([]reflect.Type{reflect.TypeOf("")}, []reflect.Type{reflect.TypeOf("")}) fn := reflect.MakeFunc(funcType, func(args []reflect.Value) []reflect.Value { ... })
reflect.MakeFunc 的第一个参数是函数类型,而第二个参数是实现该函数的函数值type.
在给定示例的上下文中:
type MyService interface { Login(username, password string) (sessionId int, err error) HelloWorld(sessionId int) (hi string, err error) }
您可以创建一个使用反射实现此接口的函数,如下所示:
fn := reflect.MakeFunc(reflect.TypeOf((*MyService)(nil)).Elem(), func(args []reflect.Value) []reflect.Value { switch args[0].String() { case "Login": return []reflect.Value{ reflect.ValueOf(1), reflect.ValueOf(nil), } case "HelloWorld": return []reflect.Value{ reflect.ValueOf("Hello, world!"), reflect.ValueOf(nil), } } return []reflect.Value{ reflect.Value{}, reflect.ValueOf(errors.New("Method not found")), } })
此实现使用 switch 语句根据第一个参数确定要调用接口的哪个方法。然后它返回输出参数的适当值。
以上是Go的反射可以创建实现预定义接口的函数吗?的详细内容。更多信息请关注PHP中文网其他相关文章!