执行不接受参数的方法

lf2*_*215 0 reflection go

给定一个结构的任意实例,我希望能够执行所有不接受参数的公共方法.

例如,在下面的代码中,我希望能够执行X {}.Foo()和X {}.Bar()而不知道它们是否存在.

package main

import (
    "fmt"
    "reflect"
)

type X struct {
    Y string
}

func (x X) Foo() string {
    return x.Y
}

func (x X) Bar() {
}

func (x X) Baz(q string) {
}

func main() {
    fooType := reflect.TypeOf(X{})
    for i := 0; i < fooType.NumMethod(); i++ {
        method := fooType.Method(i)
        fmt.Println(method.Name)
    }
}
Run Code Online (Sandbox Code Playgroud)

Tim*_*per 5

  1. 更改reflect.TypeOf到reflect.ValueOf
  2. 检查型的Method,保证是接受零个参数
  3. 用方法调用方法 Call
foo := reflect.ValueOf(X{})
for i := 0; i < foo.NumMethod(); i++ {
    method := foo.Method(i)
    if method.Type().NumIn() == 0 {
        method.Call(nil)
    }
}
Run Code Online (Sandbox Code Playgroud)

https://play.golang.org/p/KYAfaFlEjVt