GO语言练习:反射

列举几个反射的例子:1)简单类型反射,2)复杂类型反射,3)对反射回来的数据的可修改属性

1、简单类型反射

  1.1)代码

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var x float64 = 3.4
    v := reflect.ValueOf(x)
    fmt.Println("type :", v.Type())
    fmt.Println("kind is float64:", v.Kind() == reflect.Float64)
    fmt.Println("value:", v.Float())
}

  1.2)运行结果

$ go run reflect.go 
type : float64
kind is float64: true
value: 3.4

 2、复杂类型反射

  2.1)代码

 1 package main
 2 
 3 import (
 4     "fmt"
 5     "reflect"
 6 )
 7 
 8 type T struct {
 9     A int
10     B string
11 }
12 
13 func main () {
14     t := T{203, "mh203"}
15     s := reflect.ValueOf(&t).Elem()
16     typeOfT := s.Type()
17     for i := 0; i < s.NumField(); i++ {
18         f := s.Field(i)
19         fmt.Printf("%d: %s %s = %v\n", i,
20         typeOfT.Field(i).Name, f.Type(), f.Interface())
21     }
22 }

  2.2)运行结果

$ go run structreflect.go 
0: A int = 203
1: B string = mh203

3、通过反射获得的变量的可设置属性

  3.1)代码实例

 1 package main
 2 
 3 import (
 4     "fmt"
 5     "reflect"
 6 )
 7 
 8 func testA() {
 9     var x float64 = 3.4
10     v := reflect.ValueOf(x)
11     if(true == v.CanSet()) {
12         fmt.Println("v is setable")
13         //v.Set(4.1)
14     } else {
15         fmt.Println("v is not setable")
16     }
17 }
18 
19 func testB() {
20     var x float64 = 3.4
21     p := reflect.ValueOf(&x)
22     fmt.Println("type of p:", p.Type())
23     fmt.Println("settablitty of p :", p.CanSet())
24 
25     v := p.Elem()
26     fmt.Println("settablitty of v:", v.CanSet())
27 
28     v.SetFloat(7.1)
29     fmt.Println(v.Interface())
30     fmt.Println(x)
31 }
32 
33 func main() {
34     testA()
35     testB()
36 }

  3.2)运行结果

$ go run set.go 
v is not setable
type of p: *float64
settablitty of p : false
settablitty of v: true
7.1
7.1

 

posted @ 2015-07-31 22:36  fengbohello  阅读(596)  评论(0编辑  收藏  举报