问题
- 结构体函数加了指针NumMethod()就获取不到,不加指针就能获取到
相关代码
package main
import(
"fmt"
"reflect"
)
type User struct{
Id int
Name string
Age int
}
func (u *User) Call(){
u.Id = 100
fmt.Printf("%v\n",u)
}
func main(){
user:=User{1,"ding",18}
GetField(user)
}
func GetField(arg interface{}){
argType := reflect.TypeOf(arg)
fmt.Println(argType.NumMethod())
for i:=0;i<argType.NumMethod();i++{
m:=argType.Method(i)
fmt.Printf("%s: %v\n",m.Name,m.Type)
}
}
结果为
0
如果将 func (u *User) Call()改为func (u User) Call()不加指针
结果为
1
Call: func(main.User)
为什么加了指针之后反而获取的值为0
###指针是一种类型。你如果要看指针类型的方法,TypeOf函数传进去指针就好
改成
GetField(&user)
###package main
import (
"fmt"
"reflect"
)
type User struct {
Id int
Name string
Age int
}
// Call 使用指针接收者实现了一个方法
func (u *User) CallPoint() {
u.Id = 100
fmt.Printf("%vn", u)
}
// CallValue 使用值接收者实现了一个方法
func (u User) CallValue() {
u.Id = 200
fmt.Printf("%vn", u)
}
func main() {
fmt.Println("--------")
user := User{1, "ding", 18}
// User 类型的值可以用来调用使用值接收者声明的方法
GetField(user)
fmt.Println("--------")
// User 类型值的指针也可以用来调用使用值接收者声明的方法
GetField(&user)
fmt.Println("========")
user2 := User{1, "ding", 28}
// 实参接收者是 T 类型的变量而形参接收者是 *T 类型
// 编译器会隐式地获取变量的地址 user2.CallPoint() // 隐式转换为 (&user)
user2.CallValue()
fmt.Println("========")
user3 := &User{1, "ding", 38}
// 实参接收者是 *T 类型而形参接收者是 T 类型
// 编译器会隐式地解引用接收者,获得实际的取值
user3.CallValue() // 隐式转换为 (*user3)
user3.CallPoint()
}
func GetField(arg interface{}) {
argType := reflect.TypeOf(arg)
fmt.Println(argType.NumMethod())
for i := 0; i < argType.NumMethod(); i++ {
m := argType.Method(i)
fmt.Printf("%s: %vn", m.Name, m.Type)
}
}
输出
--------
1
CallValue: func(main.User)
--------
2
CallPoint: func(*main.User)
CallValue: func(*main.User)
========
&{100 ding 28}
{200 ding 28}
========
{200 ding 38}
&{100 ding 38}