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

go chapter 9 - 反射

时间:2018-08-02 20:46:27      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:The   str   can   ==   ptr   tps   address   object   type   

https://www.jianshu.com/p/53adb1e92710

// 根据反射,获取对象的字段名,类型,值

func StructInfo(o interface{}){
    t := reflect.TypeOf(o)  //获取类型

    if k := t.Kind(); k != reflect.Struct{
        fmt.Println("the object is not a struct, but it is", t.Kind())
        return
    }

    v := reflect.ValueOf(o)  // 获取值
	
    for i := 0; i < t.NumField(); i++{ // 获取字段
        f := t.Field(i)   // 获取当前的字段(名字,类型)
        val := v.Field(i).Interface()  // 获取值
        fmt.Printf("%6s:%v = %v \n", f.Name, f.Type, val) 
    }
}

  

// 根据反射,设置变量,调用方法

/*
  通过反射设置字段
*/
func ReflectSet(o interface{}){
    v := reflect.ValueOf(o)
    if v.Kind() == reflect.Ptr && !v.Elem().CanSet(){
        fmt.Println("修改失败")
        return
    }
    v = v.Elem()
    //获取字段
    f := v.FieldByName("Name")
    if !f.IsValid(){
        fmt.Println("修改失败")
        return
    }
    //设置值
    if f.Kind() == reflect.String{
        f.SetString("chairis")
    }
}

/* 
  通过反射调用函数
*/
func ReflectMethod(o interface{}){
    v := reflect.ValueOf(o)
    //无参函数调用
    m1:= v.MethodByName("Say")
    m1.Call([]reflect.Value{})

    //有参函数调用
    m2 := v.MethodByName("Hello")
    m2.Call([]reflect.Value{reflect.ValueOf("iris")})
}

 

stu := Student{Address:Address{City:"Shanghai", Area:"Pudong"}, Name:"chain", Age:23}

fmt.Println("before: ", stu)
ReflectSet(&stu)
fmt.Println("after: ", stu)

  

  

 

go chapter 9 - 反射

标签:The   str   can   ==   ptr   tps   address   object   type   

原文地址:https://www.cnblogs.com/webglcn/p/9409219.html

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