假设我有一个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)
}
}
撒科打诨
慕勒3428872
随时随地看视频慕课网APP
相关分类