我可以用額外的一雙眼睛來解決這個挑戰(zhàn),這里是游樂場最終目標(biāo)是將函數(shù)和結(jié)構(gòu)公共函數(shù)注冊到活動管理器中,并通過函數(shù)名稱執(zhí)行它們,因此類似于: 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)}這么說,我得到了它與以下實現(xiàn)的功能一起使用: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貢獻(xiàn)1906條經(jīng)驗 獲得超3個贊
調(diào)用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
}
- 1 回答
- 0 關(guān)注
- 108 瀏覽
添加回答
舉報
0/150
提交
取消