码迷,mamicode.com
首页 > 其他好文 > 详细

golang反射举例

时间:2018-12-11 19:54:36      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:绑定   ring   method   image   反射   类型   ola   value   图片   

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

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\n", num)

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

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

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

	numMethon := val.NumMethod()

	fmt.Printf("stuct has %d methons\n", 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反射举例

标签:绑定   ring   method   image   反射   类型   ola   value   图片   

原文地址:https://www.cnblogs.com/LC161616/p/10104327.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!