标签: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)
标签:The str can == ptr tps address object type
原文地址:https://www.cnblogs.com/webglcn/p/9409219.html