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

如何在不使用反射的情况下在 golang 中优雅地动态调用方法?

如何在不使用反射的情况下在 golang 中优雅地动态调用方法?

Go
萧十郎 2021-12-20 19:03:57
我正在使用反射来做到这一点:        method_name := CommandMap[command]    thing := reflect.ValueOf(self).MethodByName(method_name)    thing_s := fmt.Sprintf("%s", thing)    if thing_s == "<invalid reflect.Value>" {        self.writeMessage(550, "not allowed")    } else {        thing.Call([]reflect.Value{})    }但必须有更好的方法。上面代码的重点是摆脱:if command == "this" {  runThis()} else if command == "that" {  runThat()} etc. etc.我不想有一棵大的 if else 树。这是一个 ftp 服务器http://github.com/andrewarrow/paradise_ftp,我需要处理 15 个左右的命令,如“USER”、“PASS”和“QUIT”等。我希望每个人都调用一个方法,例如“handleUser”或“handlePass”。但是使用反射是一个坏主意。太慢了。
查看完整描述

1 回答

?
德玛西亚99

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

从您链接的用例来看,将字符串映射到函数似乎效果最好。例子:


func MakeCommandMap() map[string]func(*Paradise) {

    m := map[string]func(*Paradise){

        "USER": (*Paradise).HandleUser,

        "PASS": (*Paradise).HandlePass,

    }

    // ...

    return m

}

调用函数:


name := "USER"

if fn := m[name]; fn != nil {

    fn(self) // where self is *Paradise

}


查看完整回答
反对 回复 2021-12-20
  • 1 回答
  • 0 关注
  • 192 浏览
慕课专栏
更多

添加回答

举报

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