你如何反思地调用 Go 结构的方法?

假设我有一个ProblemSolver包含 1,000 多种“问题解决”方法的结构:


type ProblemSolver struct {}


func (ps ProblemSolver) problem1() {

    fmt.Println("Solving problem #1 ...")

    return

}


func (ps ProblemSolver) problem2() {

    fmt.Println("Solving problem #2 ...")

    return

}


...

    

func (ps ProblemSolver) problem1001() {

    fmt.Println("Solving problem #1001 ...")

    return

}

并说我想解决特定的问题——比如问题#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改用 - 我尝试阅读https://blog.golang.org/laws-of-reflection,但我发现它很难阅读。


是否可以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)

    }

}


撒科打诨
浏览 159回答 1
1回答

慕勒3428872

您可以直接调用这些函数: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)这些方法未导出,为了使反射起作用,您必须导出它们。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go