如何反思性地调用Go结构';什么方法?

如何反思性地调用Go结构';什么方法?,go,Go,假设我有一个ProblemSolverstruct,有1000多种“问题解决”方法: 说我想解决一些具体的问题,比如问题1、3、4、8、9、10、11、14、19、20。。。等等 func main() { ps := ProblemSolver{} problems := [100]int{1, 3, 4, 8, 9, 10, 11, 14, 19, 20 ...} } 我知道您可以直接调用这些“一级函数”,但这有一种代码味道: ps.problem1() ps.proble

假设我有一个
ProblemSolver
struct,有1000多种“问题解决”方法:

说我想解决一些具体的问题,比如问题1、3、4、8、9、10、11、14、19、20。。。等等

func main() {
    ps := ProblemSolver{}
    problems := [100]int{1, 3, 4, 8, 9, 10, 11, 14, 19, 20 ...}
}
我知道您可以直接调用这些“一级函数”,但这有一种代码味道:

ps.problem1()
ps.problem3()
ps.problem4()
...
ps.problem1001()
我正在考虑改用
reflect
——我试着阅读,但我发现阅读起来很困难

是否可以使用
reflect
仅调用我想要的函数(与上面的
problems
变量一样)

编辑:我使用下面Burak的解决方案得出了类似的结果,效果非常好。谢谢

// Solve : Solves specified problems.
func (ps ProblemSolver) Solve() {
    val := reflect.ValueOf(ps)

    specifiedProblems := []int{1, 3, 4}

    for _, sp := range specifiedProblems{
        methodName := fmt.Sprintf("Problem%d", sp)
        val.MethodByName(methodName).Call(nil)
    }
}

您可以直接调用这些函数:

ps.problem1()
ps.problem3()
ps.problem4()
...
您可以将它们放入数组中并调用它们:

problems:[]func(){ps.problem1,ps.problem3,ps.problem4,...}
for _,x:=range problems {
   x()
}
或者您可以使用反射:

val:=reflect.ValueOf(ps)
val.MethodByName(fmt.Sprintf("Problem%d",num)).Call(nil)

这些方法是未报告的,为了使反射工作,您必须导出它们。

@Volker该函数只解决一个问题。我想以特定的顺序解决许多问题。我应该补充-这个假设的
problem()
函数将是一个非常完整的函数。谢谢Burak-我已经用我使用的解决方案更新了我的问题。我必须导出我的方法,将每个函数的第一个字母大写,这样才能工作。谢谢你的帮助-现在我不必写一个20000行的函数来完成100种不同的事情了。:)
val:=reflect.ValueOf(ps)
val.MethodByName(fmt.Sprintf("Problem%d",num)).Call(nil)