Pointers 如何在golang中优雅地动态调用方法而不使用反射?

Pointers 如何在golang中优雅地动态调用方法而不使用反射?,pointers,reflection,go,function-pointers,Pointers,Reflection,Go,Function Pointers,我使用反射来实现这一点: 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 allow

我使用反射来实现这一点:

        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{})
    }

我不想有一棵大的“如果有别的话”树。这是一个ftp服务器,我需要处理15个左右的命令,如“USER”、“PASS”和“QUIT”等。我希望每个命令调用一个方法,如“handleUser”或“handlePass”。但是使用反射是个坏主意。它太慢了。

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

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
}

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

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
}

Go不是一种脚本语言,所以这不是一种“优雅”的语言。也许如果你解释一下你的用例是什么,也许会有更好的解决方案。当然这是一个ftp服务器,我需要处理15个左右的命令,如“USER”、“PASS”和“QUIT”等。我希望每个人调用一个方法,如“handleUser”或“handlePass”,避免一个大的if-else树。Go不是一种脚本语言,所以这不是你可以“优雅地”做的事情。如果你解释一下你的用例是什么,也许会有更好的解决方案。当然这是一个ftp服务器,我需要处理15个左右的命令,如“USER”、“PASS”和“QUIT”等。我希望每个人都调用一个方法,如“handleUser”或“handlePass”,并避免一个大的if-else树。