我正在使用反射来做到这一点: 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
}
- 1 回答
- 0 关注
- 192 浏览
添加回答
举报
0/150
提交
取消