问答

golang反射NumMethod()返回值的问题

作者:admin 2021-04-21 我要评论

问题 结构体函数加了指针NumMethod()就获取不到,不加指针就能获取到 相关代码 package mainimport( "fmt" "reflect")type User struct{ Id int Name string Age...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

问题

  • 结构体函数加了指针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}

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • golang反射NumMethod()返回值的问题

    golang反射NumMethod()返回值的问题

  • 请问怎样给feaflet做一个罗盘功能。

    请问怎样给feaflet做一个罗盘功能。

  • vue下载图片跨域怎么解决?

    vue下载图片跨域怎么解决?

  • 如何食用vue向后端发送数据请求

    如何食用vue向后端发送数据请求

腾讯云代理商
海外云服务器