为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用反射获取任意方法签名?

如何使用反射获取任意方法签名?

Go
慕尼黑的夜晚无繁华 2023-02-14 16:38:42
我可以用额外的一双眼睛来解决这个挑战,这里是游乐场最终目标是将函数和结构公共函数注册到活动管理器中,并通过函数名称执行它们,因此类似于:  pool := map[string]interface{       "Sample": func(ctx context.Context) error,       "Sample2": func(ctx context.Context, args ...interface{}) error,       "SampleFromStruct": func(ctx context.Context) error,       "Sample2FromStruct": func(ctx context.Context, args ...interface{}) error,   }功能看起来像:func Sample(ctx context.Context) error {    fmt.Println("exec Sample")    return nil}func Sample2(ctx context.Context, args interface{}) error {    arguments := struct {        Foo string `json:"foo"`        Bar string `json:"bar"`    }{    b, err := json.Marshal(args)    if err != nil {        return err    }    if err := json.Unmarshal(b, &arguments); err != nil {        return err    }    fmt.Println("exec Sample2 with args", arguments)    return nil}// and same but with structtype ActivityInStruct struct {    Bar string}func (a *ActivityInStruct) SampleInStruct(ctx context.Context) error {    fmt.Println("Value of Bar", a.Bar)    return Sample(ctx)}func (a *ActivityInStruct) Sample2InStruct(ctx context.Context, args interface{}) error {    fmt.Println("Value of Bar", a.Bar)    return Sample2(ctx, args)}这么说,我得到了它与以下实现的功能一起使用:type activityManager struct {    fnStorage map[string]interface{}}func (lm *activityManager) Register(fn interface{}) error {    fnName := strings.Split((runtime.FuncForPC(reflect.ValueOf(fn).Pointer()).Name()), ".")    name := fnName[len(fnName)-1]    lm.fnStorage[name] = fn    return nil}
查看完整描述

1 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

调用Value.Method以获取方法值

func (lm *activityManager) RegisterStruct(fn interface{}) error {

    v := reflect.ValueOf(fn)

    t := v.Type()

    for i := 0; i < t.NumMethod(); i++ {

        m := t.Method(i)

        if m.IsExported() {

            lm.fnStorage[m.Name] = v.Method(i).Interface()

        }

    }

    return nil

}


查看完整回答
反对 回复 2023-02-14
  • 1 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信