反射获取对象的属性,值,方法
package main
import "fmt"
import "reflect"
func main() {
u := User{1, "ok", 12}
Info(u)
}
//任何一个对象都实现了空接口
func Info(o interface{}) {
t := reflect.TypeOf(o) //获取类型 User类型
fmt.Println("Type", t.Name())
if K := t.Kind(); K != reflect.Struct {
fmt.Println("传入的类型不对,不能传地址值,需要传对象或者基本数据类型的地址值")
return
}
v := reflect.ValueOf(o)
fmt.Println("fields")
for i := 0; i < t.NumField(); i++ {
f := t.Field(i) //获取user的对象属性
val := v.Field(i).Interface() //获取属性值
fmt.Printf("%6s: %v = %v\n", f.Name, f.Type, val)
}
//获取方法
for i := 0; i < t.NumMethod(); i++ {
m := t.Method(i)
fmt.Printf("%6s: %v\n", m.Name, m.Type)
}
}
//方法
func (user User) hello() {
fmt.Println("hello world")
}
//对象
type User struct {
Id int
Name string
Age int
}
Type User
fields
Id: int = 1
Name: string = ok
Age: int = 12
hello: func(main.User)
反射匿名字段,基本类型
package main
import "fmt"
import "reflect"
func main() {
m := Manager{User: User{1, "ok", 12}, title: "13"}
t := reflect.TypeOf(m)
//Anonymous:true 匿名字段
fmt.Printf("%#v\n", t.Field(0))
//取出User中的第一个属性--Id
fmt.Printf("%#v\n", t.FieldByIndex([]int{0, 0}))
/************通过反射对基本类型进行操作***********/
x := 123
//参数为struct类型,所以要传指针过去
v := reflect.ValueOf(&x)
v.Elem().SetInt(999)
fmt.Println(x)
}
/*反射匿名字段**/
type Manager struct {
User
title string
}
//对象
type User struct {
Id int
Name string
Age int
}
reflect.StructField{Name:"User", PkgPath:"", Type:(*reflect.rtype)(0x4f53a0), Tag:"", Offset:0x0, Index:[]int{0}, Anonymous:true}
reflect.StructField{Name:"Id", PkgPath:"", Type:(*reflect.rtype)(0x4cc0c0), Tag:"", Offset:0x0, Index:[]int{0}, Anonymous:false}
999
反射修改对象的属性
package main
import "fmt"
import "reflect"
func main() {
u := User{1, "ok", 12}
set(&u) //指针传给,就可以修改目标对象
fmt.Println(u)
}
func set(o interface{}) {
v := reflect.ValueOf(o)
if v.Kind() == reflect.Ptr && !v.Elem().CanSet() {
fmt.Println("xxx")
return
} else {
//直接赋值
v = v.Elem()
}
f := v.FieldByName("Name")
if !f.IsValid() { //如果没有取出Name
fmt.Println("bad")
return
}
if f.Kind() == reflect.String {
f.SetString("byby")
}
}
//对象
type User struct {
Id int
Name string
Age int
}
{1 byby 12}
反射调用对象的方法
package main
import "fmt"
import "reflect"
/*
反射调用对象的方法
*/
func main() {
u := User{1, "ok", 12}
v := reflect.ValueOf(u)
//反射获取对象的Hello方法
mv := v.MethodByName("Hello")
//构造一个切片
args := []reflect.Value{reflect.ValueOf("joe")}
//arg参数(joe)调用mv(Hello)方法
mv.Call(args)
}
//对象方法
func (u User) Hello(name string) {
fmt.Println("hello", name, ",my name is", u.Name)
}
//对象
type User struct {
Id int
Name string
Age int
}
hello joe ,my name is ok
有疑问加站长微信联系(非本文作者)