go-reflect

    xiaoxiao2025-05-31  29

    反射获取对象的属性,值,方法

    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
    转载请注明原文地址: https://ju.6miu.com/read-1299458.html
    最新回复(0)