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并发代码片段]