0

你能帮我理解为什么使用reflect.Typereflect.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, ","))
    }
}
4

0 回答 0