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)
}
本文探讨了在Go语言中如何正确使用reflect包下的NumMethod函数来获取结构体方法的数量。通过对比不同方法签名的实现,解释了为什么某些情况下NumMethod返回0,而其他情况下则能正确返回方法数量。
1193

被折叠的 条评论
为什么被折叠?



