通过函数名变量调用函数,利用反射

golang_china · · 4795 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

当需要利用函数名变量调用函数的时候 一般都是为了封装,最近工作中遇到这么样的一个问题,百度出来的一些demo都很扯,估计一个人随便写了一个就被传开了吧,反正写的很麻烦,我研究了一下找出来这个比较好的方法,所以拿出来跟大家分享一下,反射还是很值得好好学习一下的,时间关系没细看,有时间要仔细看一下。 下面代码的目的:通过 字符串变量 "Signup",实现对 User.Signup 的调用 ``` package main import ( "fmt" "reflect" ) type User struct { Name string } func (u User) Signup(name string, age int) { fmt.Println("name123123:", name, "age:", age) } func (u User) Signin() { fmt.Println("name:", u.Name) } func main() { user := User{ Name: "zhangsan", } funcName := "Signup" v := make([]reflect.Value, 3) v[0] = reflect.ValueOf(user) // 数组第一个值必须为 结构体实例的reflect.Value, 如果函数没有参数,这个值也必须有,v[1],v[2]不需要 v[1] = reflect.ValueOf("likun") v[2] = reflect.ValueOf(27) m, _ := reflect.TypeOf(user).MethodByName(funcName) // m 类型为 reflect.Value m.Func.Call(v) // 函数调用 } ``` 总结: 1.m.Func 这是 Signup 函数的 reflect.Value,光有这个函数不够,还需要有结构体的实例 reflect.Value,这块我也没有特别懂,源码太复杂 我看不懂,我感觉有了 Signup 函数的 reflect.Value 应该不需要知道实例了吧,可能是源码对代码的组织问题引起的,模块之间耦合 没有互相共享信息。还请知道的大大们给讲下。 2. 要注意函数的接受者,golang 中对 函数的接收者很讲究的。

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4795 次点击  ∙  1 赞  
加入收藏 微博
5 回复  |  直到 2016-03-02 16:33:14
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传