go反射调用结构体对象方法

golang语言使用反射机制,调用结构体相关方法,方法包含传参和返回结果

package main

import (
    "log"
    "reflect"
)

/*
    反射类 相关学习
 */

func main() {
    var u1 *User

    u1 = GenStruct(u1).(*User)
    log.Printf("GenStruct方法后返回结果:%+v", u1)

    var name = "张三"
    var id = 123
    var isBoy = true
    var u2 User
    Call(&u2, name, id, isBoy)
    log.Printf("Call方法后user:%+v", u2)
}

type User struct {
    Id    int  `json:"id"`
    Name  string `json:"name"`
    IsBoy bool   `json:"is_boy"`
}

func (u *User) GetName() string {
    log.Println("执行GetName方法")
    return u.Name
}

func (u *User) SetName(name string) {
    log.Println("执行SetName方法")
    u.Name = name
}

func (u *User) GetId() int {
    log.Println("执行GetId方法")
    return u.Id
}

func (u *User) SetId(id int) {
    log.Println("执行SetId方法")
    u.Id = id
}

func (u *User) GetIsBoy() bool {
    log.Println("执行GetIsBoy方法")
    return u.IsBoy
}

func (u *User) SetIsBoy(isBoy bool) {
    log.Println("执行SetIsBoy方法")
    u.IsBoy = isBoy
}

// 反射调用结构体对象方法
func Call(typ interface{}, name string, id int, isBoy bool) {
    val := reflect.ValueOf(typ)

    // 调用SetName方法
    _ = val.MethodByName("SetName").Call([]reflect.Value{reflect.ValueOf(name)})

    // 调用GetName方法
    nameVals := val.MethodByName("GetName").Call([]reflect.Value{})
    for _, v := range nameVals {
        log.Println("执行SetName方法后 GetName方法返回结果值:", v.Interface().(string))
    }

    // 调用 SetId 方法
    _ = val.MethodByName("SetId").Call([]reflect.Value{reflect.ValueOf(id)})

    // 调用 GetId 方法
    idVals := val.MethodByName("GetId").Call([]reflect.Value{})
    for _, v := range idVals {
        log.Println("执行SetId方法后 GetId方法返回结果值:", v.Interface().(int))
    }

    // 调用SetName方法
    _ = val.MethodByName("SetIsBoy").Call([]reflect.Value{reflect.ValueOf(isBoy)})

    // 调用GetName方法
    isBoyVals := val.MethodByName("GetIsBoy").Call([]reflect.Value{})
    for _, v := range isBoyVals {
        log.Println("执行SetIsBoy方法后 GetIsBoy方法返回结果值:", v.Interface().(bool))
    }
}

// 反射生成结构体
func GenStruct(req interface{}) interface{} {
    typ := reflect.TypeOf(req)
    if typ.Kind() == reflect.Ptr {
        typ = typ.Elem()
    }
    return reflect.New(typ).Interface()
}

输出结果:
GenStruct方法后返回结果:&{Id:0 Name: IsBoy:false}
执行SetName方法
执行GetName方法
执行SetName方法后 GetName方法返回结果值: 张三
执行SetId方法
执行GetId方法
执行SetId方法后 GetId方法返回结果值: 123
执行SetIsBoy方法
执行GetIsBoy方法
执行SetIsBoy方法后 GetIsBoy方法返回结果值: true
Call方法后user:{Id:123 Name:张三 IsBoy:true}

上面已经有非常详细的代码注解了,所以也不用太多的解释,如有不明白的地方,可以直接留言沟通

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你不懂程序员的Bug

打赏点吧, 不容易啊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值