在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 结构体的方法?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在编程网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!