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)
- }