假設(shè)我有一個ProblemSolver包含 1,000 多種“問題解決”方法的結(jié)構(gòu):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 ...}}我知道你可以直接調(diào)用這些“一流的函數(shù)”,但這有一種代碼味道:ps.problem1()ps.problem3()ps.problem4()...ps.problem1001()我正在考慮reflect改用 - 我嘗試閱讀https://blog.golang.org/laws-of-reflection,但我發(fā)現(xiàn)它很難閱讀。是否可以reflect只調(diào)用我想要的函數(shù)(如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貢獻(xiàn)1848條經(jīng)驗 獲得超6個贊
您可以直接調(diào)用這些函數(shù):
ps.problem1()
ps.problem3()
ps.problem4()
...
您可以將它們放在一個數(shù)組中并調(diào)用它們:
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)
這些方法未導(dǎo)出,為了使反射起作用,您必須導(dǎo)出它們。
- 1 回答
- 0 關(guān)注
- 118 瀏覽
添加回答
舉報
0/150
提交
取消