知识点 反射

package main

import (
"fmt"
"github.com/sirupsen/logrus"
"reflect"
)

type People struct {
Name string `xml:"name"`
Address string `xml:"address"`
}

func (this *People) Start(methodName string) {
Val := reflect.ValueOf(this)
fmt.Println("00", Val)
MethodRef := Val.MethodByName(methodName)
fmt.Println("11", MethodRef)

if !MethodRef.IsValid() {
return
}
var args []reflect.Value
MethodRef.Call(args)
}
func (this *People) Running() {
fmt.Println("people is running")
}

func main() {
//获取属性的值
a := "asd"
fmt.Println(reflect.TypeOf(a), reflect.ValueOf(a))
peo := People{"zhangsan", "朝阳"} //因为是获取属性的值所以没有用指针
v := reflect.ValueOf(peo)
fmt.Println(v.NumField(), v.FieldByIndex([]int{0}), v.Field(1))
content := "Name"
fmt.Println(v.FieldByName(content))
logrus.Println("end")
//设置属性的值
peo1 := new(People) //因为是设置属性的值所以用指针类型
v = reflect.ValueOf(peo1).Elem() //反射时获取peo1的地址,Elem()获取指针指向地址的封装,地址的值只有调用Elem()才可以继续操作
fmt.Println(v.FieldByName(content).CanSet()) //结构体的属性首字母必须大写,否则返回false,意味着属性不能设置
v.FieldByName(content).SetString("lisi")
v.FieldByName("Address").SetString("湖南")
fmt.Println(peo1) //设置Name与Address成功
//获取tag(标记)
t := reflect.TypeOf(People{})
fmt.Println(t.FieldByName("Name")) //{Name string xml:"name" 0 [0] false} true
aa, _ := t.FieldByName("Name")
fmt.Println(aa.Tag) //xml:"name"
fmt.Println(aa.Tag.Get("xml")) //name
//获取方法名
peo2 := new(People)
v3 := reflect.ValueOf(peo2).Elem()
fmt.Println(v3.FieldByName("Name").CanSet())
v3.FieldByName("Name").SetString("lisi")
v3.FieldByName("Address").SetString("湖南")
peo2.Start("Running")
}

猜你喜欢

转载自www.cnblogs.com/chu-12345/p/11368818.html