登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-02 09:30:36 180浏览 收藏

在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是Golang学习者,那么本文《如何反思性地调用 Go 结构体的方法?》就很适合你!本篇内容主要包括##content_title##,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

假设我有一个 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)
    }
}

解决方案


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

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)

这些方法未导出,为了使反射正常工作,您必须导出它们。

今天关于《如何反思性地调用 Go 结构体的方法?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>