为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
撒科打诨 2022-06-27 16:23:25
假设我有一个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)

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


查看完整回答
反对 回复 2022-06-27
  • 1 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信