猿问

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

我正在使用反射来做到这一点:


        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”。但是使用反射是一个坏主意。太慢了。


萧十郎
浏览 193回答 1
1回答

德玛西亚99

从您链接的用例来看,将字符串映射到函数似乎效果最好。例子:func MakeCommandMap() map[string]func(*Paradise) {&nbsp; &nbsp; m := map[string]func(*Paradise){&nbsp; &nbsp; &nbsp; &nbsp; "USER": (*Paradise).HandleUser,&nbsp; &nbsp; &nbsp; &nbsp; "PASS": (*Paradise).HandlePass,&nbsp; &nbsp; }&nbsp; &nbsp; // ...&nbsp; &nbsp; return m}调用函数:name := "USER"if fn := m[name]; fn != nil {&nbsp; &nbsp; fn(self) // where self is *Paradise}
随时随地看视频慕课网APP

相关分类

Go
我要回答