golang反射举例

Posted lc161616

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang反射举例相关的知识,希望对你有一定的参考价值。

反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。

package main

import (
	"fmt"
	"reflect"
)

type stu struct {
	Name  string `json:"name"`
	Age   int    `json:"age"`
	intro string
}

func (t stu) Print() {
	fmt.Println("---start---")
	fmt.Println(t)
	fmt.Println("---end---")
}

func (s stu) GetSum(n1, n2 int) {
	fmt.Println(n1 + n2)
}

func (s stu) Set(name string, age int, intro string) {
	s.Name = name
	s.Age = age
	s.intro = intro
}

func (s stu) Aa() {
	fmt.Println("aaaa")
}

func test(a interface{}) {
	typ := reflect.TypeOf(a)
	val := reflect.ValueOf(a)

	kid := val.Kind()

	if kid != reflect.Struct {
		fmt.Println("expect struct")
		return
	}

	num := val.NumField()

	fmt.Printf("struct has %d fields
", num)

	for i := 0; i < num; i++ {
		fmt.Printf("field %d is value=%v 
", i, val.Field(i))

		tagval := typ.Field(i).Tag.Get("json")

		if tagval != "" {
			fmt.Printf("field %d is tag=%v
", i, tagval)
		}
	}

	numMethon := val.NumMethod()

	fmt.Printf("stuct has %d methons
", numMethon)

	var r = []reflect.Value{
		reflect.ValueOf(10),
		reflect.ValueOf(20),
	}
	val.Method(1).Call(r)
}

func main() {
	var animal stu = stu{
		Name:  "黄鼠狼",
		Age:   22,
		intro: "爱吃老鼠",
	}

	test(animal)
}

技术分享图片

.Call()方法

func (v Value) Call(in []Value) []Value

使用输入的参数in调用v持有的函数。例如,如果len(in) == 3,v(in[0], in[1], in[2])(其中Value值表示其持有值), 0 1 2 4根据首字母的asiic码值进行排序,如此处需要A 0 G 1 以此类推。

in参数接收一个reflect.Value封装的切片[],返回输出结果也是reflect.Value封装的切片[] q

 

method方法

func (v Value) Method(i int) Value

返回v持有值类型的已绑定的第i个方法(到v的持有值的)状态的函数形式的reflect.Value封装。返回值调用Call方法时不应包含接收者

	rm := val.Method(1)

	fmt.Printf("methon type is: %v", &rm)

返回值为指针类型,

技术分享图片

 

以上是关于golang反射举例的主要内容,如果未能解决你的问题,请参考以下文章

golang goroutine例子[golang并发代码片段]

[golang]反射的用处--代码自动生成

golang代码片段(摘抄)

java 反射代码片段

GoLang - 有没有办法分析使用反射的代码的内存使用情况?

代码片段 - Golang 实现简单的 Web 服务器