golang反射调用方法

golang通过reflect反射调用方法

  • 在call方法 (类/结构体的函数) 的时候, 会把类/结构体本身指针作为第一个参数入栈, 然后再入栈其它参数

  • 示例


package main

import (
	"errors"
	"log"
	"reflect"
)

type Student struct {
}

type Option struct {
	Value int
}

func (s *Student) A(o Option) {
	log.Println("A", o.Value)
}

func (s *Student) B(o Option) {
	log.Println("A", o.Value)
}

func (s *Student) C(o Option) (interface{}, error) {
	log.Println("c:", o.Value)
	return "a", errors.New("hello")
}

var methods = map[string]int{
	"A": 1,
	"B": 2,
	"C": 3,
}

func main() {

	var stu = &Student{}

	reflectType := reflect.TypeOf(stu)
	for i := 0; i < reflectType.NumMethod(); i++ {
		method := reflectType.Method(i)
		if v, ok := methods[method.Name]; ok {
			var args = make([]reflect.Value, 0)

			o := Option{Value: v}
			// 汇编中类的方法调用第一个参数会把类本身指针作为第一个参数入栈, 然后再入栈其它参数,这里同cpp的汇编调用方式
			// 因为方法里可能会用到里面的字段 所以需要该结构体的内存首地址
			args = append(args, reflect.ValueOf(stu))
			args = append(args, reflect.Indirect(reflect.ValueOf(o)))
			res := method.Func.Call(args)
			log.Println(method.Name, method.Type.In(0), method.Type.In(1), len(res))
			if len(res) > 0 {
				log.Println(res[0].Type(), res[1].Type())
			}

		}
	}
}

结构体

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值