Go 中的反射要点
2015-09-25 15:18
531 查看
简介
反射是元数据编程的一种形式,指的是程序获得本身结构的一种能力。不同语言的反射模型实现不一样,本文中的反射,仅仅指的是Go语言中的反射模型。类型以及接口
这个基本概念需要清晰,这里不详细展开。基本类型就是一个值,接口类型是(值,类型)对。
看下面两个图:
当然还有一些内存优化的东西,这里也不展开。
接口对象到反射对象
反射只是从接口变量里面读取类型和值对。类型和值就是我们要的反射对象。package main import ( "fmt" "reflect" ) func main() { var x float64 = 3.4 fmt.Println("type:", reflect.TypeOf(x)) }
类型
// TypeOf returns the reflection Type of the value in the interface{}. func TypeOf(i interface{}) Type
值
var x float64 = 3.4 fmt.Println("value:", reflect.ValueOf(x))
反射对象到接口对象
y := v.Interface().(float64) // y will have type float64.fmt.Println(y)
这里可以把Interface()看作ValueOf()的逆操作,只不过返回值类型永远是静态的interface{}。
要修改反射对象,值必须是settable
var x float64 = 3.4v := reflect.ValueOf(x)v.SetFloat(7.1) // Error: will panic.
我们可以把指针传进去,然后就可以干了。
var x float64 = 3.4p := reflect.ValueOf(&x) // Note: take the address of x.fmt.Println("type of p:", p.Type())fmt.Println("settability of p:", p.CanSet())v := p.Elem()fmt.Println("settability of v:", v.CanSet())
下面是一个比较完整的反射修改的例子:
type T struct { A int B string } t := T{23, "skidoo"} 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()) }
参考
http://blog.golang.org/laws-of-reflection
相关文章推荐
- Logo常用的12种颜色
- Django Meta内部类选项
- GoldenGate
- Django中更新多个对象数据与删除对象的方法
- 反素数(题目Divisors)
- The Karplus-Strong Algorithm
- The Karplus-Strong Algorithm
- my django notes
- PAT:05-1. List Components (25),Go语言解答
- PAT: Root of AVL Tree (25),Go语言
- PAT:03-2. List Leaves,Go语言解答
- GoLang基本配置
- ContentNegotiatingViewResolver - 内容协商视图解析器
- 物料移动(MIGO/MB01等)更新物料凭证信息出口(user exit)
- POJ 3107 Godfather (树的重心)
- Google ptorobuf相关知识
- Google ptorobuf相关知识
- Google ptorobuf相关知识
- Google ptorobuf相关知识
- Google ptorobuf相关知识