十一、自省和反射

 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