一: 反射spa
1 反射是指在程序運行期對程序自己進行訪問和修改的能力 2 go程序在運行期使用reflect包訪問程序的反射信息
1查看類型、字段和方法指針
package main import ( "fmt" "reflect" ) //結構體 type User struct { Id int Name string Age int } //綁定方法 func (u User) Hello() { fmt.Println("Hello User!") } //反射操做 func Info(o interface{}) { //獲取目標對象信息 t := reflect.TypeOf(o) //獲取Name,也就是對象類型 fmt.Println("傳入的對象類型:", t.Name()) //獲取對象的值信息 v := reflect.ValueOf(o) fmt.Println("字段:===========================") //遍歷出全部字段 //NumField()獲取對象有幾個字段 for i := 0; i < t.NumField(); i++ { //取每一個字段 f := t.Field(i) //經過interface()能夠取具體字段對應的值 val := v.Field(i).Interface() fmt.Printf("%s:%v=%v\n", f.Name, f.Type, val) } fmt.Println("方法:============================") for i := 0; i < t.NumMethod(); i++ { m := t.Method(i) fmt.Printf("%s:%v\n", m.Name, m.Type) } } func main() { u := User{1, "Mr.Sun", 18} Info(u) }
2查看匿名字段code
package main import ( "reflect" "fmt" ) //結構體 type User struct { Id int Name string Age int } type Boy struct { User Addr string } func main() { m := Boy{User{1,"zhangsan",20},"sz"} //獲取對象信息 t := reflect.TypeOf(m) //#號會把反射的結構體的詳情打印 fmt.Printf("%#v\n",t.Field(0)) }
3 修改基本類型的值對象
package main import ( "fmt" "reflect" ) func main() { x :=123 v :=reflect.ValueOf(&x) v.Elem().SetInt(666) fmt.Println(x) }
4 修改結構體的值blog
package main import ( "reflect" "fmt" ) //結構體 type User struct { Id int Name string Age int } //反射修改結構體的值 func SetValue(o interface{}) { //獲取值類型 v := reflect.ValueOf(o) //獲取指針指向的元素 v = v.Elem() //修改User的Name f := v.FieldByName("Name") //Kind()是判斷字段類型 if f.Kind() == reflect.String { f.SetString("wangwu") } } func main() { u := User{1, "lisi", 22} SetValue(&u) fmt.Println(u) }
5 調用方法string
package main import ( "reflect" "fmt" ) //結構體 type User struct { Id int Name string Age int } func (u User) Hello(name string) { fmt.Println("Hello", name, "My name is", u.Name) } func main() { u := User{1, "lisi", 22} //獲取對象值信息 v := reflect.ValueOf(u) //經過方法名字,取到具體方法 m := v.MethodByName("Hello") //設置方法參數 args := []reflect.Value{reflect.ValueOf("wangwu")} //調用方法 m.Call(args) }