|
|
51CTO旗下网站
|
|
移动端

9.2.1 方法和类型的反射

《Go语言编程入门与实战技巧》第9章接口与反射,本章需要注意设计类型时确认类型的本质是原始的还是非原始的。接口是声明了一组行为并支持多态的类型,嵌入类型提供了扩展类型的能力,而无须使用继承。本节为大家介绍方法和类型的反射。

作者:黄靖钧来源:电子工业出版社|2018-09-23 09:31

9.2  反射

反射是用程序检查代码中所拥有的结构尤其是类型的一种能力,这是元编程的一种形式。反射可以在运行时检查类型和变量,例如它的大小、方法和动态调用这些方法。这对于没有源代码的包尤其有用。这是一个强大的工具,但是也存在一定的隐患,除非真的有必要,否则应当避免使用或小心使用。

9.2.1  方法和类型的反射

变量的最基本信息就是类型和值:反射包的Type用来表示一个Go语言类型,反射包的Value为Go值提供了反射接口。

两个简单的函数:reflect.TypeOf和reflect.ValueOf,返回被检查对象的类型和值。例如,x被定义为var x float64 = 3.4,那么reflect.TypeOf(x)返回float64,reflect.ValueOf(x)返回<float64 Value> 。

实际上,反射通过检查一个接口的值,把变量转换成空接口。这从下面两个函数签名(定义了函数或方法的输入与输出的格式)能够很明显看出来:

  1. func TypeOf(i interface{}) Type  
  2. func ValueOf(i interface{}) Value 

接口的值包含一个type和value。反射可以从接口值反射到对象,也可以从对象反射回接口值。

reflect.Type和reflect.Value都有许多方法用于检查和操作它们。一个重要的例子是Value有一个Type方法返回reflect.Value的Type;另一个是Type和Value都有Kind方法返回一个常量来表示类型:Uint、Float64、Slice等。同样Value有叫作Int和Float的方法可以获取存储在内部的值(和int64和float64一样)。

对于变量x,如果v:=reflect.ValueOf(x),那么v.Kind()返回float64,所以下面的表达式返回的结果是true(即两者全等):

  1. v.Kind() == reflect.Float64 

Kind()总是返回底层类型:

  1. type MyInt int  
  2. var m MyInt = 5 
  3. :reflect.ValueOf(m)  

方法v.Kind()返回reflect.Int。变量v的Interface()方法可以得到还原(接口)值,所以可以这样打印v的值:fmt.Println(v.Interface())。

尝试运行下面的代码:

  1. // 示例代码9-5  
  2. package main  
  3.  
  4. import (  
  5.     "fmt"  
  6.     "reflect"  
  7. )  
  8.  
  9. func main() {  
  10.     var x float64 = 3.4  
  11.     fmt.Println("type:", reflect.TypeOf(x))  
  12.     v :reflect.ValueOf(x)  
  13.     fmt.Println("value:", v)  
  14.     fmt.Println("type:", v.Type())  
  15.     fmt.Println("kind:", v.Kind())  
  16.     fmt.Println("value:", v.Float())  
  17.     fmt.Println(v.Interface())  
  18.     fmt.Printf("value is %5.2e\n", v.Interface())  
  19.     y :v.Interface().(float64)  
  20.     fmt.Println(y)  
  21. }  
  22. /*  
  23. 返回:  
  24. type: float64  
  25. value: <float64 Value> 
  26. type: float64  
  27. kind: float64  
  28. value: 3.4  
  29. 3.4  
  30. value is 3.40e+00  
  31. 3.4  
  32. */  

x是一个float64类型的值,reflect.ValueOf(x).Float()返回这个float64类型的实际值;reflect.ValueOf(x)适用于Int()、Bool()、Complex()、String()等其他类型。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书会第9群:808517103

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

Eclipse Web开发从入门到精通(实例版)

本书由浅入深、循序渐进地介绍了目前流行的基于Eclipse的优秀框架。全书共分14章,内容涵盖了Eclipse基础、ANT资源构造、数据库应用开发、W...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊