NumMethod用来返回一个Reflect.Type类型,主要是结构体和指针类型所包含的方法(method)的个数,和其联系的方法还有MethodByName和Method(int)
当然对于结构体来说,其只返回expose的方法,也就是大写开头的方法。当然我这里讲的是另外一个问题,如下
package main
import (
"fmt"
"reflect"
)
type Person struct {
name string
age uint
}
func (p *Person) Say() {
fmt.Println("i am talking")
}
func (p *Person) Walk() {
fmt.Println("i am walking")
}
func main() {
p1 := Person{"huangfeng", 18}
fmt.Println(reflect.TypeOf(p1).NumMethod())//0
}
上述会返回零
下面的结果则会正常显示
package main
import (
"fmt"
"reflect"
)
type Person struct {
name string
age uint
}
func (p Person) Say() {
fmt.Println("i am talking")
}
func (p Person) Walk() {
fmt.Println("i am walking")
}
func main() {
p1 := Person{"huangfeng", 18}
fmt.Println(reflect.TypeOf(p1).NumMethod()) //2
}
出现上述问题的原因在于第一种写法中,method本质上是放在指针上的,相应的也需要指针去拿取,比如如下的写法
package main
import (
"fmt"
"reflect"
)
type Person struct {
name string
age uint
}
func (p *Person) Say() {
fmt.Println("i am talking")
}
func (p *Person) Walk() {
fmt.Println("i am walking")
}
func main() {
p1 := &Person{"huangfeng", 18}
res1 := reflect.TypeOf(p1).NumMethod()
p2 := Person{"huangfeng", 18}
res2 := reflect.PointerTo(reflect.TypeOf(p2)).NumMethod()
fmt.Println(res1, res2)
}