你能帮我理解为什么使用reflect.Type和reflect.Value我不能为相同的方法获得相同数量的输入参数吗?
我知道第二种方法可能不正确,因为 Strings() 有三个参数,u User,value int,s string,但为什么不正确?
package main
import (
"fmt"
"reflect"
)
type User struct {
i int
}
func (u User) Strings(value int, s string) {}
func (u User) Get() {}
func main() {
var u = User{1}
val := reflect.ValueOf(u)
method := val.Method(1)
numsIn := method.Type().NumIn()
fmt.Println(numsIn) // prints 2
typ := reflect.TypeOf(u)
method_ := typ.Method(1)
numsIn_ := method_.Type.NumIn()
fmt.Println(numsIn_) // prints 3
}
https://play.golang.org/p/XZHL9WBRTzd
我还附上了一些在研究该问题时在博客中找到的参考代码。
func main() {
var wg sync.WaitGroup
typ := reflect.TypeOf(&wg)
for i := 0; i < typ.NumMethod(); i++ {
method := typ.Method(i)
argv := make([]string, 0, method.Type.NumIn())
returns := make([]string, 0, method.Type.NumOut())
// j starts from 0,the first input parameter is itself which is wg
for j := 1; j < method.Type.NumIn(); j++ {
argv = append(argv, method.Type.In(j).Name())
}
for j := 0; j < method.Type.NumOut(); j++ {
returns = append(returns, method.Type.Out(j).Name())
}
log.Printf("func (w *%s) %s(%s) %s",
typ.Elem().Name(),
method.Name,
strings.Join(argv, ","),
strings.Join(returns, ","))
}
}