假设我有一个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) }}
1 回答
慕勒3428872
TA贡献1848条经验 获得超6个赞
您可以直接调用这些函数:
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)
这些方法未导出,为了使反射起作用,您必须导出它们。
- 1 回答
- 0 关注
- 97 浏览
添加回答
举报
0/150
提交
取消