十一、自省和反射
1 package main 2 3 import ( 4 "fmt" 5 "reflect" 6 ) 7 8 type Person struct { 9 name string "namestr" //namestr是标签 10 age int 11 } 12 13 func ShowTag(i interface{}) { 14 //Elem()得到指针指向的值,Field(0).Tag得到了manestr 15 switch t := reflect.TypeOf(i); t.Kind() { 16 case reflect.Ptr: 17 tag := t.Elem().Field(0).Tag 18 fmt.Println(t.Elem()) 19 fmt.Println(tag) 20 fmt.Println(reflect.Ptr) 21 fmt.Println(t) 22 } 23 } 24 25 func show(i interface{}) { 26 switch i.(type) { 27 case *Person: 28 t := reflect.TypeOf(i) //得到类型的元数据 29 v := reflect.ValueOf(i) //得到实际的值 30 tag := t.Elem().Field(0).Tag 31 name := v.Elem().Field(0).String() 32 fmt.Println(t) //*main.Person 33 fmt.Println(v) //<*main.Person Value> 34 fmt.Println(tag) //manestr 35 fmt.Println(name) //你是谁 36 } 37 } 38 39 func main() { 40 p1 := new(Person) 41 p1.name = "你是谁" 42 ShowTag(p1) 43 show(p1) 44 }
结果:
main.Person
namestr
ptr
*main.Person
*main.Person
<*main.Person Value>
namestr
你是谁
1 package main 2 3 import ( 4 "fmt" 5 "reflect" 6 ) 7 8 type Person struct { 9 Name string "namestr" //Name的开头是大写 公有 10 age int 11 } 12 13 func Set(i interface{}) { 14 switch i.(type) { 15 case *Person: 16 r := reflect.ValueOf(i) 17 r.Elem().Field(0).SetString("SGSGSFG") 18 } 19 } 20 21 func main() { 22 //p := new(Person) 取址 23 var p Person //指向指针 24 fmt.Println(&p) 25 Set(&p) 26 fmt.Println(&p) 27 }
结果:
&{ 0}
&{SGSGSFG 0}
转载于:https://www.cnblogs.com/liubiaoren/archive/2013/02/02/2890486.html