您的位置:首页 > 编程语言 > Go语言

GO语言练习:反射

2015-07-31 22:36 405 查看
列举几个反射的例子: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)代码

package main

import (
"fmt"
"reflect"
)

type T struct {
A int
B string
}

func main () {
t := T{203, "mh203"}
s := reflect.ValueOf(&t).Elem()
typeOfT := s.Type()
for i := 0; i < s.NumField(); i++ {
f := s.Field(i)
fmt.Printf("%d: %s %s = %v\n", i,
typeOfT.Field(i).Name, f.Type(), f.Interface())
}
}


  2.2)运行结果

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


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

  3.1)代码实例

package main

import (
"fmt"
"reflect"
)

func testA() {
var x float64 = 3.4
v := reflect.ValueOf(x)
if(true == v.CanSet()) {
fmt.Println("v is setable")
//v.Set(4.1)
} else {
fmt.Println("v is not setable")
}
}

func testB() {
var x float64 = 3.4
p := reflect.ValueOf(&x)
fmt.Println("type of p:", p.Type())
fmt.Println("settablitty of p :", p.CanSet())

v := p.Elem()
fmt.Println("settablitty of v:", v.CanSet())

v.SetFloat(7.1)
fmt.Println(v.Interface())
fmt.Println(x)
}

func main() {
testA()
testB()
}


  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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: